算法思想
通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小段只,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序惜浅,整個排序過程可以遞歸進(jìn)行脉让,以此達(dá)到整個數(shù)據(jù)變成有序序列。
算法步驟
設(shè)置兩個變量i跷睦、j筷弦,排序開始的時候:i=0,j=N-1;
以第一個數(shù)組元素作為關(guān)鍵數(shù)據(jù)烂琴,賦值給key爹殊,即key=A[0];
從j開始向前搜索奸绷,即由后開始向前搜索(j--)梗夸,找到第一個小于key的值A(chǔ)[j],將A[j]和A[i]互換号醉;
從i開始向后搜索反症,即由前開始向后搜索(i++),找到第一個大于key的A[i]畔派,將A[i]和A[j]互換铅碍;
重復(fù)第3、4步线椰,直到i=j胞谈; (3,4步中,沒找到符合條件的值憨愉,即3中A[j]不小于key,4中A[i]不大于key的時候改變j烦绳、i的值,使得j=j-1配紫,i=i+1径密,直至找到為止。找到符合條件的值躺孝,進(jìn)行交換的時候i享扔, j指針位置不變。另外括细,i==j這一過程一定正好是i+或j-完成的時候伪很,此時令循環(huán)結(jié)束)戚啥。
一趟排序的過程
排序的全過程
算法復(fù)雜度
- 快速排序的平均時間復(fù)雜度為:O(nlogn)
- 快速排序最差的情況下時間復(fù)雜度為:O( n^2 )
算法實現(xiàn)(JAVA)
public void quickSort(int[] arr,int low,int high){
if(low < high){
int loc = partition(arr,low,high);
quickSort(arr,low,loc - 1);
quickSort(arr,loc + 1,high);
}
}
private int partition(int[] arr,int low,int high){
int standard = arr[low];
while(low < high){
//從后向前
while(low < high && arr[high] >= standard)--high;
arr[low] = arr[high];
//從前向后
while(low < high && arr[low] <= standard)++low;
arr[high] = arr[low];
}
arr[high] = standard;
return low;
}