快速排序演算法

2021-08-20 07:22:21 字數 2096 閱讀 4296

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

該方法的基本思想是:

1.先數列中去除乙個數作為準基數(此處以第乙個為準基數)

2.將比這個數大的資料放在他的右邊,比他小的資料放在他的左邊,(乙個乙個資料的比較)

3.在重複第二步,知道每個區間都是左小右大

雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。因此我的對快速排序作了進一步的說明:填數法+分治法:

先看一段**

// 快速排序

static void sort(int s, int l, int r)

// 找到後賦值

if (i < j)

while (i < j && x >= s[i])

if (i < j)

}

s[i] = x;

sort(s, l, i - 1); // 遞迴呼叫

sort(s, i + 1, r);

for (int a : s)

} }public static void main(string args) ;

sort(indexs, 0, indexs.length - 1);

}

注意:

s[i++] = s[j];s[i++]並不是i加1之後的值,而是i之前的值
思考?

1.為什麼在賦值部分需要寫乙個判斷if(i原因:

因為在乙個乙個查詢基準數前面和後面的資料時,需要對下標進行相加減已獲得對應的資料,當加減後i不一定小於j了,

因此需要判斷

2.

s[i++] = s[j];s[i++]是否可以換種寫法?若可以,可換成什麼方法?
答案:在最基礎的氣泡排序中,我們可以知道賦值的方法是找小三的原則,因此也可以用找小三來賦值

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

2345

6789

7265788

6042

8373

4885

首先定義基準數為96

從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--;

陣列變為:01

2345

6789

4865788

6042

8373

8885

i = 3;   j = 7;   x=72

再重複上面的步驟,(j是從前面開始找比他小的,i是從後面找比他大的),找左小右大的資料

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

從i開始向後找,當i=5時,由於i==j退出本次迴圈,(再次迴圈時所有資料重新執行,開始的i=0,j=陣列長度)。

而迴圈執行的資料為,i = j = 5,而a[5]剛好又是上次挖的坑,因此將x填入a[5]。

陣列變為:01

2345

6789

4865742

6072

8373

8885

可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。之後再每個區間每個區間的資料乙個乙個的比較.

對填數法進行總結(相當於是挖坑)

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

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

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

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

建議:所有資料都自己推算出來,並且乙個乙個執行出來,不要只是簡單的領悟

歡迎各位大神指正缺點!

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

演算法設計 快速排序 隨機快速排序演算法

1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...