一.演算法思想:
假設要對某陣列進行由小->大排序
(1) 分解: 對於亂序陣列a[r](訪問範圍[0->r],有r+1個數),取乙個基準元素a[p](一般以第乙個數即a[0]為基準),確定某個partition(位置)q ,使a[q]右邊的數都大於等於a[p],a[q]左邊的數都小於等於a[p].
(2)遞迴分治:分解之後,陣列變成3部分 a[0]-a[q],a[q],a[q+1]-a[r]. a[q]只有乙個元素,以它為標桿,對a[0]->a[q]和a[q+1]->a[r]分別執行步驟(1)
二.例子示例:
數 組: 0 1 2 3 4 5 6
原序列: 7 12 9 8 5 2 3
⑴.令p=0,取標桿a[p]為7作為基準,把a[0]存起來,記x=a[0];
令i=p+1,i開始向右邊走,找到》=7的數,此時i停留在下標1處
令j=r,j開始向左移動,找到<=7的數,則j停留在下標6處,如果i數 組: 0 1 2 3 4 5 6
現序列: 7
3 9 8 5 212
繼續執行步驟⑴,i到下標2處,j到下標5處,如果i7 3
2 8 5
9 12
繼續執行步驟⑴,i到下標3處,j到下標4處,如果i現序列: 7 3 25 8 9 12
其中,i,j的移動在迴圈中(見後續**),如果找不到符合條件的數,會一直移動,直到i=r,則陣列遍歷完畢,i不再移動,此時i到了下標6處
而j繼續移動,5符合條件,來到下標3處 ,但由於i>=j條件不成立,不交換a[i],a[j],此時交換a[p],a[j],j=3
數 組: 0 1 2 3 4 5 6
現序列: 5 3 2 7 8 9 12
到此乙個小分割就結束了,返回j下標q=3,可以看出a[0->(j-1)]都小於或等於標桿x,即7,a[j+1->r]都大於或等於x.
後續可按上續步驟執行,
a[0]-a[q]:
數 組: 0 1 2
現序列: 5 3 2
x=0,i向右走,i=1,直到i=2,j向左找,找到a[j]<=x停止,此時j在下標2處,但由於i現序列: 2 3 5
a[q+1]-a[r]:
數 組: 3 4 5 6
現序列: 7 8 9 12
同理,由於一直不滿足條件,i走到下標6處 j走到下標3處,此時i>j,執行交換a[p],a[j],原序列不變,演算法結束
所以最終序列為:
數 組: 0 1 2 3 4 5 6
現序列: 2 3 5 7 8 9 12
三.源**:
#includeusing namespace std;
int partition(int a,int p, int r);
void quicksort(int a,int p, int r)
swap(a[p],a[j]);
return j; //返回分界標桿
}void main()
; cout<
for (int i = 0; i < 7; i++)
{ cout<
四.執行結果:
快速排序 分治演算法
基於分治策略的排序在快速排序中,記錄的比較和交換是從兩端向中間進行的,關鍵字較大 小 的記錄一次就能交換到後 前 面單元,總的比較和移動次數較少。基本思想 對於輸入子陣列a p r 分解 以a p 為基準元素將a p r 劃分成三段a p q 1 a q 和a q 1 r 使得a p q 1 中任一...
排序演算法 快速排序(分治法)
思想 快速排序採用的思想是分治思想。快速排序是找出乙個元素 理論上可以隨便找乙個 作為基準 pivot 然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n 1個元素也調整到排序後的正確位置。最...
分治演算法之快速排序
快速排序演算法也是基於分治思想的一種排序演算法,它的基本操作即為比較 交換。快速排序演算法的基本思想是從待排序的序列中選取乙個比較標準k 通常選取第乙個元素 然後將其餘元素依次跟k進行比較。在比較的過程中將大於k的元素移到k的後面,將小於k的元素移到k的前面,最後的結果是將原始序列分為兩個子串行,而...