快速排序的主要思想就是:分治+快速排序算法
將原問題分解成若干規模更小可是結構和原問題相同的子問題。遞歸求解子問題,而後解出原問題。數組
結果爲以基數分界,左邊的數比所有比基數小,右邊的數比基數大。結束此次排序。
而後,下次分別排序[first,i-1]和[i+1,last],使序列左邊有序和右邊有序
這是一個遞歸的過程,直到first > i-1或者i+1 > last 返回ui
這樣就將原問題劃分紅兩個與原問題相同的子問題,再次對這兩個區間進行快速排序。code
仍是以序列3,2,5,6,4,7,1爲例
開始的時候以第一個數3爲基數,3所處的位置就至關於一個坑,空出來
base = 3;i = 0;j = 6;排序
2 | 5 | 6 | 4 | 7 | 1 | |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 |
i | j |
從後往前找小於基數的的數,找到最後一個數1,因而將1填在位置0,位置6就被空出來了, i++向中間移位遞歸
1 | 2 | 5 | 6 | 4 | 7 | |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 |
i | j |
從前日後找大於基數的數,找到5,因而將5填在位置6,位置2就被空出,j--向中間移位table
1 | 2 | 6 | 4 | 7 | 5 | |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 |
i | j |
而後又從後往前找,找小於基數的數,當j==i時,結束本次排序。
最後基數插入空出的位置2ast
1 | 2 | 3 | 6 | 4 | 7 | 5 |
---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 |
i j |
能夠發現,基數左邊的數都小於基數,右邊的數都大於基數。以基數分界,下次排序就分別排序列[first,i-1]和[i+1,last]即序列[1,2]和[6,4,7,5]class
排序序列[1,2]
基數爲0
i=0;j=1;
從後往前找,由於只有一個數且大於1,所以在i==j後,1仍舊插入位置0
本次排序結束
由於i-1=-1 小於本次排序中的first 0,因此本序列不在進行劃分排序循環
排序序列[6,4,7,5]
base = 6; i = first ; j=last;
即i=3,j=6
4 | 7 | 5 | |
---|---|---|---|
3 | 4 | 5 | 6 |
i | j |
從後往前找小於6的數,找到5,將其填入位置0,位置6就空出來了。而後i++,向中間移位
5 | 4 | 7 | |
---|---|---|---|
3 | 4 | 5 | 6 |
i | j |
從前日後找大於6的數,找到7,因而將7填入位置6,位置5就空出,而後j--,向中間移位
5 | 4 | 7 | |
---|---|---|---|
3 | 4 | 5 | 6 |
i j |
由於i==j,因此結束本次排序,將6插入i所指的位置。
5 | 4 | 6 | 7 |
---|---|---|---|
3 | 4 | 5 | 6 |
i j |
這次繼續排序[first,i-1]和[i+1,last]即[5,4]和[7]
由於i+1 == last 因此不在進行排序
排序[5,4]相似於排序前面的序列[1,2],只不過序列[5,4]排序後爲[4,5]
最終序列變得有序
//分治 void QuickSort(int a[],int first,int last) { if(first < last) { int i = AdjustArray(a,first,last);//以基數分界,對基數左邊快排,對基數右邊快排 QuickSort(a,first,i-1); QuickSort(a,i+1,last); } } //快速排序的代碼(能夠理解爲挖坑填數) int AdjustArray(int a[],int first,int last) { int i = first,j = last; int m = a[first];//以第一個數爲基數 while(i<j) { while(i<j && a[j] >= m)//從後往前找小於基數的數 j--; if(i<j) { a[i] = a[j];//將a[j]填到a[i],a[j]變成一個坑 i++; } while(i<j && a[i] < m)//從前日後找比基數大的數 i++; if(i<j) { a[j] = a[i];//將a[i]填到a[j],a[i]變成一個坑 j--; } } a[i] = m;//退出時,i=j,將基數填入坑中 return i; }