快速排序算法

快速排序算法

數據處理方法
快速排序是對冒泡排序的一種改進。它的基本思想是:通過一趟排序将要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分别進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。[1]
    中文名:快速排序算法 外文名: 所屬學科:數據結構 英文名:Quick Sort 發展:對冒泡排序的一種改進 提出者:C. A. R. Hoare 适用領域:Pascal,c++等語言

實例

假設要排序的數組是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

45 36 18 53 72 30 48 93 15 36

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)重複上述過程,通過遞歸将左右側部分進行排序。

相關詞條

相關搜索

其它詞條