정렬 편 (7) -- 빠 른 정렬
8407 단어 데이터 구조
1. 빠 른 정렬
기본 사상: 한 번 의 정렬 을 통 해 대기 기록 을 독립 된 두 부분 으로 나 누 었 는데 그 중에서 일부 기록 의 키 워드 는 모두 다른 부분 에 기 록 된 키워드 보다 작 으 면 이 두 부분 기록 에 대해 계속 정렬 하여 전체 서열 이 질서 있 는 목적 을 달성 할 수 있다.
2. 빠 른 정렬 알고리즘 실현
package Sort;
/**
* Created by LKL on 2017/3/4.
*/
public class TestQuickSort {
public static void main(String[] args){
int[] adj = new int[]{5,1,9,8,3,7,4,6,2};
print(adj);
QuickSort(adj);
}
public static void QuickSort(int[] adj){
QSort(adj,0,adj.length-1);
}
public static void QSort(int[] adj,int low,int high){
int pivot;
if(low// ,
pivot = Partition(adj,low,high);
//
QSort(adj,low,pivot-1);
//
QSort(adj,pivot+1,high);
//
print(adj);
}
}
/*
* , ,
* , , (pivot)
*
* */
public static int Partition(int[] adj,int low,int high){
int pivotkey;
pivotkey=adj[low];
//
while(lowwhile(low=pivotkey){
high--;
}
swap(adj,low,high);//
while(low//
}
return low;
}
public static void swap(int[] adj,int low,int high){
int temp;
temp=adj[low];
adj[low]=adj[high];
adj[high]=temp;
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
}
실행 결 과 는 다음 과 같 습 니 다.
5 1 9 8 3 7 4 6 2
1 2 3 4 5 7 8 6 9
1 2 3 4 5 7 8 6 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
3. 빠 른 정렬 최적화
상기 코드 로 인해 우 리 는 가설 적 인 조작 이 있 습 니 다. 즉, pivot 가 low 와 high 의 중간 에 있다 고 가정 하 는 것 입 니 다. 사실은 이렇게 우연 하지 않 습 니 다. {9, 1, 3, 5, 2, 4, 7, 6, 8} 이 나 타 났 을 때 pivot 는 9 이 고 전환 한 후에 실질 적 인 최적화 가 발생 하지 않 았 기 때문에 '3 수 취 중 법', 즉 세 개의 키 워드 를 먼저 정렬 하 는 것 이 생각 났 습 니 다.중간 수 를 중심 축 으로 하 는 것 은 일반적으로 왼쪽 끝, 오른쪽 끝 과 중간 세 개의 수 를 취한 다.이때 pivot 는 적어도 가장 크 거나 가장 작 지 는 않 을 것 이다.주로 Patition 방법 을 수 정 했 는데 먼저 pivot 가 최대 도, 최소 도 아니 라 고 판정 했다.
/*
* , ,
* , , (pivot)
*
* */
public static int Partition(int[] adj,int low,int high){
int pivotkey;
int m=low +(high-low)/2;
if(adj[low]>adj[high]){
swap(adj,low,high);
}
if(adj[m]>adj[high]){
swap(adj,high,m);
}
if(adj[m]>adj[low]){
swap(adj,m,low);
}
pivotkey=adj[low];
//
while(lowwhile(low=pivotkey){
high--;
}
swap(adj,low,high);//
while(low//
}
return low;
}
4. 빠 른 정렬 복잡 도 분석
(1) 빠 른 정렬 이 가장 좋 은 시간 복잡 도
빠 른 정렬 이 가장 좋 은 경 우 는 매번 얻 은 요소 가 전체 배열 을 똑 같이 나 누 는 것 이다 (위의 것 이 아 닌 것 이 분명 하 다).이때 의 시간 복잡 도 공식 은 T [n] = 2T [n / 2] + f (n) 이다.T [n / 2] 는 평 분 된 하위 배열 의 시간 복잡 도 이 고 f [n] 는 이 배열 을 나 눌 때 걸 리 는 시간 입 니 다.다음은 가장 좋 은 상황 에서 빠 른 정렬 시간 복잡 도 계산 (교체 법 으로) 을 추산 한다.
T[n] = 2T[n/2] + n ------
령: n = n / 2 = 2 {2 T [n / 4] + (n / 2)} + n - 두 번 째 귀속
= 2^2 T[ n/ (2^2) ] + 2n
령: n = n / (2 ^ 2) = 2 ^ 2 {2 T [n / (2 ^ 3)] + n / (2 ^ 2)} + 2 n - 세 번 째 귀속
= 2^3 T[ n/ (2^3) ] + 3n
......................................................................................
:n = n/( 2^(m-1) ) = 2^m T[1] + mn ---------------- m (m )
, , T[1] , (T[1] )。
획득: T [n / (2 ^ m)] = T [1] = = > n = 2 ^ m = = = > > m = logn;T[n] = 2^m T[1] + mn ;그 중 m = logn;
T[n] = 2^(logn) T[1] + nlogn = n T[1] + nlogn = n + nlogn ; n
또 n > = 2 시: nlogn > = n (즉 logn > 1) 이 므 로 뒤의 nlogn 을 가 져 옵 니 다.
: :O( nlogn )。
(2) 최 악의 경우 시간 복잡 도
/ , ( ), O(n^2)。
(3) 평균 시간 복잡 도 는 O (nlogn)
(4) 공간 복잡 도:
:O(logn); ;
:O( n ); 。
글 은 단지 자신의 학습 노트 로 서 인터넷 의 많은 사례 를 참고 하 였 을 뿐 입 니 다. 만약 에 여유 가 있다 고 생각한다 면 많이 교류 하고 싶 습 니 다. 여기 서 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.