實例
假設要排序的數組是A【1】……A【N】,首先任意選取一個數據(通常選用第一個數據)作為關鍵數據,然後将所有比它的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一躺快速排序。一躺快速排序的算法是:
1)、設置兩個變量I、J,排序開始的時候I:=1,J:=N;
2)以第一個數組元素作為關鍵數據,賦值給X,即X:=A【1】;
3)、從J開始向前搜索,即由後開始向前搜索(J:=J-1),找到第一個小于X的值,兩者交換;
4)、從I開始向後搜索,即由前開始向後搜索(I:=I+1),找到第一個大于X的值,兩者交換;
5)、重複第3、4步,直到I=J;
例如:待排序的數組A的值分别是:(初始關鍵數據X:=49)
A【1】 A【2】 A【3】 A【4】 A【5】 A【6】 A【7】:
49 38 65 97 76 13 27
進行第一次交換後: 27 38 65 97 76 13 49
( 按照算法的第三步從後面開始找
進行第二次交換後: 27 38 49 97 76 13 65
( 按照算法的第四步從前面開始找>X的值,65>49,兩者交換,此時I:=3 )
進行第三次交換後: 27 38 13 97 76 49 65
( 按照算法的第五步将又一次執行算法的第三步從後開始找
進行第四次交換後: 27 38 13 49 76 97 65
( 按照算法的第四步從前面開始找大于X的值,97>49,兩者交換,此時J:=4 )
此時再執行第三不的時候就發現I=J,從而結束一躺快速排序,那麼經過一躺快速排序之後的結果是:27 38 13 49 76 97 65,即所以大于49的數全部在49的後面,所以小于49的數全部在49的前面。
快速排序就是遞歸調用此過程——在以49為中點分割這個數據序列,分别對前面一部分和後面一部分進行類似的快速排序,從而完成全部數據序列的快速排序,最後把此數據序列變成一個有序的序列,根據這種思想對于上述數組A的快速排序的全過程如圖6所示:
初始狀态 {49 38 65 97 76 13 27}
進行一次快速排序之後劃分為 {27 38 13} 49 {76 97 65}
分别對前後兩部分進行快速排序 27
結束 結束 {49 65} 76
49 結束
結束
圖6 快速排序全過程
1)、設有N(假設N=10)個數,存放在S數組中;
2)、在S【1。。N】中任取一個元素作為比較基準,例如取T=S【1】,起目的就是在定出T應在排序結果中的位置K,這個K的位置在:S【1。。K-1】<=S【K】<=S【K+1..N】,即在S【K】以前的數都小于S【K】,在S【K】以後的數都大于S【K】;
3)、利用分治思想(即大化小的策略)可進一步對S【1。。K-1】和S【K+1。。N】兩組數據再進行快速排序直到分組對象隻有一個數據為止。
如具體數據如下,那麼第一躺快速排序的過程是:
數組下标: 1 2 3 4 5 6 7 8 9 10
I J
(1) 36 36 18 53 72 30 48 93 15 45
(2) 36 36 18 45 72 30 48 93 15 53
(3) 36 36 18 15 72 30 48 93 45 53
(4) 36 36 18 15 45 30 48 93 72 53
(5) 36 36 18 15 30 45 48 93 72 53
通過一躺排序将45放到應該放的位置K,這裡K=6,那麼再對S【1。。5】和S【6。。10】分别進行快速排序。
算法介紹
設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作為關鍵數據,然後将所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結束時産生變動。
一趟快速排序的算法是:
1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
2)以第一個數組元素作為關鍵數據,賦值給key,即key=A[0];
3)從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小于key的值A[j],将A[j]賦給A[i];
4)從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大于key的A[i],将A[i]賦給A[j];
5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小于key,4中A[j]不大于key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環結束)。
排序流程
快速排序算法通過多次比較和交換來實現排序,其排序流程如下:n(1)首先設定一個分解值,通過分界值将數組分為兩部分。n(2)将大于分解值的數據集中放在右邊,小于分解值的數據放在左邊。此時小于分解值的數都在左邊,大于分解值的數都在右邊。n(3)然後左邊和右邊的數組可以獨立排序。對于左側的數組數據,又可以取一個分界值,将部分數據分成左右兩部分,同樣将左邊放置較小數,右邊放置較大數。右側數據也類似處理。n(4)重複上述過程,通過遞歸将左右側部分進行排序。