快速排序 挖坑填數 分治法

2021-08-08 03:39:43 字數 1772 閱讀 9017

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。

該方法的基本思想是:

1.先從數列中取出乙個數作為基準數。

2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有乙個數。

雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。

因此我的對快速排序作了進一步的說明:

挖坑填數+分治法:

先來看例項吧,定義下面再給出(最好能用自己的話來總結定義,這樣對實現**會有幫助)。

以乙個陣列作為示例,取區間第乙個數為基準數。 0

1 23 4

5 67 8

9 72

6 57

88 60

42 83

73 48

85 初始時,i = 0;  j = 9;   x = a[i] = 72

由於已經將a[0]中的數儲存到x中,可以理解成在陣列a[0]上挖了個坑,可以將其它資料填充到這來。

從j開始向前找乙個比x小或等於x的數。當j=8,符合條件,將a[8]挖出再填到上乙個坑a[0]中:a[0]=a[8]; i++;  這樣乙個坑a[0]就被搞定了。

但又形成了乙個新坑a[8],這怎麼辦了?簡單,再找數字來填a[8]這個坑。這次從i開始向後找乙個大於x的數,當i=3,符合條件,將a[3]挖出再填到上乙個坑中:a[8]=a[3]; j--;

陣列變為: 0

1 23 4

5 67 8

9 48

6 57

8860 42

83 73

8885

i = 3;   j = 7;   x=72

再重複上面的步驟,先從後向前找,再從前向後找

從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;

從i開始向後找,當i=5時,由於i==j退出。

此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將x填入a[5]。

陣列變為: 0

1234

5678

9486

57 4260 72

83 73

8885

可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對a[0…4]和a[6…9]這二個子區間重複上述步驟就可以了。

對挖坑填數進行總結

1.i =l; j = r; 將基準數挖出形成第乙個坑a[i]。

2.j--由後向前找比它小的數,找到後挖出此數填前乙個坑a[i]中。

3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑a[j]中。

4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。

照著這個總結很容易實現挖坑填數的**:

package paixu;

public class maopao

system.out.println("j="+j+":"+a[0]+a[1]+a[2]+a[3]+a[4]);

}}

} public static void main(string args) ;

maopao.function(a);

for (int i : a)

}}

快速排序 挖坑填數 分治法

分析來自原文 此處為自我理解 i left j right 將基準數x挖出形成第乙個坑a i while i j 直到i等於j 將基準數x填入a i 中 返回此時的 或者 int adjustarray int s,int left,int right right exchange while ii...

快速排序(Quick Sort) 挖坑填數法

前面的博文講了氣泡排序 選擇排序 插入排序,今天我們談談快速排序!快速排序的基本思想是 1 先從序列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。分割槽的方式多樣,但一定要保證基準數左邊的數比它大 小 右邊的數比它小 大 3 再對左右區間重複...

「挖坑填坑」理解快速排序

快速排序的基本思路 找乙個基準元素,對陣列進行調整,調整的標準是,這個基準元素的左邊存放的都是比這個元素小的,右邊都是比這個元素大的。然後分而治之,對左右兩邊的子陣列利用同樣的規則調整,調整到每乙個子陣列中都只有乙個元素時結束。基本思想很簡單,主要是理解如何在確定基準元素之後,對陣列 子陣列 進行調...