分治演算法 快速排序

2021-07-09 04:49:50 字數 1672 閱讀 5306

一.演算法思想:

假設要對某陣列進行由小->大排序

(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的前面,最後的結果是將原始序列分為兩個子串行,而...