快速排序的原理:選擇一個關鍵值作為基准值。比基准值小的都在左邊序列(一般是無序的),比基准值大的都在右邊(一般是無序的)。一般選擇序列的第一個元素。
一次循環:從后往前比較,用基准值和最后一個值比較,如果比基准值小的交換位置,如果沒有繼續比較下一個,直到找到第一個比基准值小的值才交換。找到這個值之后,又從前往后開始比較,如果有比基准值大的,交換位置,如果沒有繼續比較下一個,直到找到第一個比基准值大的值才交換。直到從前往后的比較索引>從后往前比較的索引,結束第一次循環,此時,對於基准值來說,左右兩邊就是有序的了。
接着分別比較左右兩邊的序列,重復上述的循環。
public class FastSort{ public static void main(String []args){ System.out.println("Hello World"); int[] a = {12,20,5,16,15,1,30,45,23,9}; int start = 0; int end = a.length-1; sort(a,start,end); for(int i = 0; i<a.length; i++){ System.out.println(a[i]); } } public void sort(int[] a,int low,int high){ int start = low; int end = high; int key = a[low]; while(end>start){ //從后往前比較 while(end>start&&a[end]>=key) //如果沒有比關鍵值小的,比較下一個,直到有比關鍵值小的交換位置,然后又從前往后比較 end--; if(a[end]<=key){ int temp = a[end]; a[end] = a[start]; a[start] = temp; } //從前往后比較 while(end>start&&a[start]<=key)//如果沒有比關鍵值大的,比較下一個,直到有比關鍵值大的交換位置 start++; if(a[start]>=key){ int temp = a[start]; a[start] = a[end]; a[end] = temp; } //此時第一次循環比較結束,關鍵值的位置已經確定了。左邊的值都比關鍵值小,右邊的值都比關鍵值大,但是兩邊的順序還有可能是不一樣的,進行下面的遞歸調用 } //遞歸 if(start>low) sort(a,low,start-1);//左邊序列。第一個索引位置到關鍵值索引-1 if(end<high) sort(a,end+1,high);//右邊序列。從關鍵值索引+1到最后一個 } }
上面最后一句不是基准值的意思是,不是直接用基准值交換,是用基准值所在的索引交換。