快速排序的原理:選擇一個關鍵值做爲基準值。比基準值小的都在左邊序列(通常是無序的),比基準值大的都在右邊(通常是無序的)。通常選擇序列的第一個元素。spa
一次循環:從後往前比較,用基準值和最後一個值比較,若是比基準值小的交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值小的值才交換。找到這個值以後,又從前日後開始比較,若是有比基準值大的,交換位置,若是沒有繼續比較下一個,直到找到第一個比基準值大的值才交換。直到從前日後的比較索引>從後往前比較的索引,結束第一次循環,此時,對於基準值來講,左右兩邊就是有序的了。code
接着分別比較左右兩邊的序列,重複上述的循環。blog
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到最後一個 } }
上面最後一句不是基準值的意思是,不是直接用基準值交換,是用基準值所在的索引交換。排序