目前公認最快的排序法,雖然最壞的時候還是會衝到O(n^2),不過大部份還是很快的(Quick Sort的速度與基準點的選擇有關)
Quick Sort分為幾個步驟
以{41,24,76,11,45,64,21,69,19,36}這個陣列為例
1.先將最左邊的數41當成基準點(s)
2.索引 I 由左邊向右找,一直找到大於基準點(s)的數
3.索引 J 由右邊向左找,一直找到小於基準點(s)的數
4.如果 I >= J 就跳出迴圈。如果 I < J,array[I]和array[J]交換
6.基準點與array[J]交換,這時 J 因為第3步驟的關係,會一直找到小於基準點的數(這時 I 已 >= J,雖迴圈跳出了,但 J 的值還在)
7.對基準點左邊及右邊進行相同步驟的遞迴
I 找到比基準點大的、J 找到比基準點小的
[41],24,76(I),11,45,64,21,69,19,36(J)
I、J交換,繼續往下找
[41],24,36,11,45(I),64,21,69,19(J),76
I、J交換,繼續往下找
[41],24,36,11,19,64(I),21(J),69,45,76
I、J交換且繼續往下找,但是 I >= J 所以會break,這時 J 停留在21
[41],24,36,11,19,21(J),64,69,45,76
基準點與 J 交換
21,24,36,11,19,[41],64,69,45,76
最後再以基準點左右兩邊做相同遞迴
Java
public class test{
static int [] num = {41,24,76,11,45,64,21,69,19,36};
public static void main(String [] argv){
quick_sort();
for(int i : num){
System.out.print(i + " ");
}
}
//Quick Sort Start
public static void quick_sort(){
sort(0,num.length-1);
}
//Recursion
public static void sort(int left, int right){
//確定是否可以排序
if(left < right){
int i = left;
int j = right + 1;
while(true){
//向右找,直到找到比基準點大的
while(i + 1 < num.length && num[++i] < num[left]);
//向左找,直到找到比基準點小的
while(j - 1 >= 0 && num[--j] > num[left]);
if(i >= j) break;
swap(i,j);
}
//基準點與j交換(這時候的j已經跑到比基準點小的數了)
swap(left,j);
//遞迴排序基準點左半邊
sort(left, j - 1);
//遞迴排序基準點右半邊
sort(j + 1 , right);
}
}
//交換
public static void swap(int i, int j){
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}