導航:首頁 > 方法技巧 > 快速排序的分治方法

快速排序的分治方法

發布時間:2025-05-20 18:40:52

㈠ 快排是什麼

快速排序

快速排序是一種高效的排序演算法,基於分治法的思想。它將待排序的數組或列表分割成若干個子序列,對每個子序列進行排序,最終合並為有序的序列。

以下是關於快速排序的詳細解釋:

1. 基本思想:快速排序的核心是分治策略。它選擇一個基準元素,將數組分為兩部分,使得比基準元素小的元素位於其左側,比基準元素大的元素位於其右側。然後,對這兩部分遞歸地進行快速排序,最終完成整個數組的排序。

2. 操作過程:在快速排序中,通常選擇數組的第一個元素作為基準值。然後,通過一趟排序將數組劃分為兩部分。在這之後,遞歸地對兩部分進行快速排序,直到劃分的部分只包含一個元素或為空為止。遞歸結束的條件是整個數組已經被完全排好序。

3. 特點:快速排序是一種不穩定的排序演算法,但在實際應用中表現良好。它的平均時間復雜度為O,其中n是待排序數組的元素個數。在最好的情況下,快速排序的性能可以接近O。但在最壞的情況下,性能可能較差。盡管如此,由於其高效性和實現的簡單性,快速排序在許多場合仍然是一種首選的排序演算法。

通過上述解釋,我們可以了解到快速排序是一種基於分治思想的排序演算法,通過將待排序序列不斷分割並遞歸地排序子序列來實現整體的排序。

㈡ 按鍵精靈快速排序(比冒泡更快更有效率的演算法)是怎麼樣的

冒泡排序為O(N^2),在排序過程中其實是效率較低的。在掃拍賣或者其他需要比拼速度的時候,時間就是金錢~越快越能搶佔先機。
今天我們介紹另一種更快更有效率的排序——快速排序,時間復雜度為O(n*logn)。

快速排序的演算法思想
快速排序採用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。
該方法的基本思想是:
1.先從數列中取出一個數作為基準數。(不要被這個名詞嚇到了,就是一個用來參照的數,待會你就知道它用來做啥的了)。
2.分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3 . 再對左右區間重復第二步,直到各區間只有一個數。

白話講解演算法:

假設我們現在對「6 1 2 7 9 3 4 5 10 8」這個10個數進行排序。就讓第一個數6作為基準數吧。接下來,需要將這個序列中所有比基準數大的數放在6的右邊,比基準數小的數放在6的左邊。
方法其實很簡單:分別從初始序列「6 1 2 7 9 3 4 5 10 8」兩端開始「探測」。先從右往左找一個小於6的數,再從左往右找一個大於6的數,然後交換他們。這里可以用兩個變數i和j,分別指向序列最左邊和最右邊。我們為這兩個變數起個好聽的名字「哨兵i」和「哨兵j」。剛開始的時候讓哨兵i指向序列的最左邊(即i=1),指向數字6。讓哨兵j指向序列的最右邊(即=10),指向數字。

2014-8-29 13:45 上傳
下載附件 (9.51 KB)

首先哨兵j開始出動。因為此處設置的基準數是最左邊的數,所以需要讓哨兵j先出動,這一點非常重要(請自己想一想為什麼)。哨兵j一步一步地向左挪動(即j--),直到找到一個小於6的數停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到一個數大於6的數停下來。最後哨兵j停在了數字5面前,哨兵i停在了數字7面前。

2014-8-29 13:45 上傳
下載附件 (9.74 KB)

2014-8-29 13:45 上傳
下載附件 (8.13 KB)

現在交換哨兵i和哨兵j所指向的元素的值。交換之後的序列如下:
6 1 2 5 9 3 4 7 10 8

2014-8-29 13:45 上傳
下載附件 (9.74 KB)

2014-8-29 13:45 上傳
下載附件 (8.37 KB)

到此,第一次交換結束。接下來開始哨兵j繼續向左挪動(再友情提醒,每次必須是哨兵j先出發)。他發現了4(比基準數6要小,滿足要求)之後停了下來。哨兵i也繼續向右挪動的,他發現了9(比基準數6要大,滿足要求)之後停了下來。此時再次進行交換,交換之後的序列如下:
6 1 2 5 4 3 9 7 10 8

第二次交換結束,「探測」繼續。哨兵j繼續向左挪動,他發現了3(比基準數6要小,滿足要求)之後又停了下來。哨兵i繼續向右移動,糟啦!此時哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。說明此時「探測」結束。我們將基準數6和3進行交換。交換之後的序列如下:
3 1 2 5 4 6 9 7 10 8

2014-8-29 13:45 上傳
下載附件 (8.28 KB)

2014-8-29 13:45 上傳
下載附件 (10.45 KB)

2014-8-29 13:45 上傳
下載附件 (8.48 KB)

到此第一輪「探測」真正結束。此時以基準數6為分界點,6左邊的數都小於等於6,6右邊的數都大於等於6。回顧一下剛才的過程,其實哨兵j的使命就是要找小於基準數的數,而哨兵i的使命就是要找大於基準數的數,直到i和j碰頭為止。

OK,解釋完畢。現在基準數6已經歸位,它正好處在序列的第6位。

3

1

2

5

4

6

9

7

10

8

此時我們已經將原來的序列,以6為分界點拆分成了兩個序列,左邊的序列是「3 1 2 5 4」,右邊的序列是「9 7 10 8」。接下來還需要分別處理這兩個序列。因為6左邊和右邊的序列目前都還是很混亂的。不過不要緊,我們已經掌握了方法,接下來只要模擬剛才的方法分別處理6左邊和右邊的序列即可。現在先來處理6左邊的序列現吧。
左邊的序列是「3 1 2 5 4」。請將這個序列以3為基準數進行調整,使得3左邊的數都小於等於3,3右邊的數都大於等於3。

3

1

2

5

4

第一次交換完:以3為分界點,拆分了兩個序列。左邊都比3小,右邊都比3大。

2

1

3

5

4

再分別處理3左右的兩個序列「2 1」和「5 4」

1

2

3

4

5

這樣,最初我們劃分的6左側的序列都已經處理好了~~我們再來處理6右側的序列

9

7

10

8

以9為基準數,第一次交換完:

9

7

8

10

第二次交換:

8

7

9

10

再交換一次:

7

8

9

10

這樣,我們整個序列就排序完畢了

1

2

3

4

5

6

7

8

9

10

快排演算法代碼實現:

su = "6|1|2|7|9|3|4|5|10|8"
su=Split(su, "|")
L = UBound(su)
Call ks(0, L)
Function ks(L, B)
If L > B Then
Exit Function
End If //判斷數組上標下標是否超出范圍
i = L
j = B
key =int( su(L) ) //數組第一位提取作為基數
While j>i
While int ( su(j)) >= key and j > i //要先從最右邊開始找 找到第一個小於key的數 這里添加的j>i的判斷是為了防止j的值不斷遞減導致下標越界
j = j - 1
Wend
While int (su(i)) <= key and j > i //從最左邊開始找 找到第一個大於key的數 (這里的字元串數組需要轉換為數值型)
i = i + 1
Wend
If j>i then // 將和基數key對比得到的兩個數對換 將大於key的值往右邊放 小於key的值往左邊放
T = su(i)
su(i) = su(j)
su(j) = T
End If
Wend // 這個 While 循環當i=j 第一輪比較完退出
su(L) = su(i) // 重新設置數組第一個元素為基數
su(i) = key// 基數歸位 (排完一輪之後 左邊的數<基數<右邊的數 那麼基數就到了排序中它該在的位置。)
Call ks(L, i - 1)//繼續處理左邊的數
Call ks(i + 1, B)//繼續處理右邊的數
End Function
For i = 0 To UBound(su)
TracePrint su(i)
Next

㈢ 快速排序演算法

快速排序是對冒泡排序演算法的一種改進,同冒泡排序一樣,快速排序也屬於交換排序,通過元素之間的比較和交換位置來達到排序的目的。

不同的是,冒泡排序在每一輪只把一個元素冒泡到數列的一端,而快速排序在每一輪挑選一個基準元素,並讓其他比它大的元素移動到數列一邊,比它小的元素移動到數列的另一邊,從而把數列拆解成了兩個部分。

快速排序是基於「分治法」原理實現,所謂分治法就是不斷地將原數組序列按照一定規律進行拆分,拆分後各自實現排序直到拆分到序列只剩下一個關鍵字為止。

快速排序首先選取一個關鍵字為標志位(關鍵字的選取影響排序效率),然後將序列中小於標志位的關鍵字移動至標志位左側,大於標志位的關鍵字移動至右側。一趟比較完成後,整個序列以選取的標志位為界,左側均小於標志位,右側均大於關鍵字。

但左右兩側內部並不是有序的(左右兩側關鍵字個數也不一定相同)。進而繼續將左右兩側分別再以這種方式進行排序,直到將序列拆分的剩餘一個關鍵字為止,整個序列即變成有序。

㈣ 快速排序演算法原理與實現

快速排序的原理:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小。

然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

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

(4)快速排序的分治方法擴展閱讀:

設要排序的數組是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[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指針位置不變。

閱讀全文

與快速排序的分治方法相關的資料

熱點內容
OT的評定方法有哪些 瀏覽:162
寶寶睡覺咳嗽打噴嚏有什麼方法 瀏覽:621
魅藍手機如何錄音許可權設置在哪裡設置方法 瀏覽:665
下拉式紗窗使用方法 瀏覽:642
簡單疊蛋糕的方法 瀏覽:496
午夜釣魚最佳方法 瀏覽:321
鍋爐水溫測量方法 瀏覽:927
零之終使用方法視頻 瀏覽:574
煲出一副好耳機的正確方法和步驟 瀏覽:735
手腳破皮有什麼土方法止疼 瀏覽:318
物理都有什麼探究方法 瀏覽:578
剛摘的柿子用什麼方法才能快速吃 瀏覽:995
斷電器與保護器連接方法 瀏覽:361
如何給下水道疏通方法 瀏覽:274
秒潮使用方法 瀏覽:582
室內減肥器材最佳方法 瀏覽:193
如何變不內向的方法 瀏覽:837
髖關節痛有哪些治療方法 瀏覽:636
常用的葯敏試驗方法有哪些 瀏覽:663
美術課堂組織方法研究前期調查表 瀏覽:512