快速排序演算法

2021-06-21 14:15:57 字數 2987 閱讀 4539

一、快速排序演算法的基本特性

時間複雜度:o(n*lgn)

最壞:o(n^2)

空間複雜度:o(n*lgn)

不穩定。

快速排序是一種排序演算法,對包含n個數的輸入陣列,平均時間為o(nlgn),最壞情況是o(n^2)。

通常是用於排序的最佳選擇。因為,基於比較的排序,最快也只能達到o(nlgn)。

二、快速排序演算法的描述

演算法導論,第7章

快速排序時基於分治模式處理的,

對乙個典型子陣列a[p...r]排序的分治過程為三個步驟:

1.分解:

a[p..r]被劃分為倆個(可能空)的子陣列a[p ..q-1]和a[q+1 ..r],使得

a[p ..q-1] <= a[q] <= a[q+1 ..r]

2.解決:通過遞迴呼叫快速排序,對子陣列a[p ..q-1]和a[q+1 ..r]排序。

3.合併。

三、快速排序演算法

版本一:

quicksort(a, p, r)

1 if p < r

2    then q ← partition(a, p, r)   //關鍵

3         quicksort(a, p, q - 1)

4         quicksort(a, q + 1, r)

陣列劃分

快速排序演算法的關鍵是partition過程,它對a[p..r]進行就地重排:

partition(a, p, r)

1  x ← a[r]

2  i ← p - 1

3  for j ← p to r - 1

4       do if a[j] ≤ x

5             then i ← i + 1

6                  exchange a[i] a[j]

7  exchange a[i + 1] a[r]

8  return i + 1

ok,咱們來舉乙個具體而完整的例子。

來對以下陣列,進行快速排序,

2   8   7   1   3   5   6   4(主元)

一、i p/j

2   8   7   1   3   5   6   4(主元)

j指的2<=4,於是i++,i也指到2,2和2互換,原陣列不變。

j後移,直到指向1..

二、j(指向1)<=4,於是i++

i指向了8,所以8與1交換。

陣列變成了:

i          j

2   1   7   8   3   5   6   4

三、j後移,指向了3,3<=4,於是i++

i這是指向了7,於是7與3交換。

陣列變成了:

i         j

2   1   3   8   7   5   6   4

四、j繼續後移,發現沒有再比4小的數,所以,執行到了最後一步,

即上述partition(a, p, r)**部分的 第7行。

因此,i後移乙個單位,指向了8

i               j

2   1   3   8   7   5   6   4

a[i + 1] a[r],即8與4交換,所以,陣列最終變成了如下形式,

2   1   3   4   7   5   6   8

ok,快速排序第一趟完成。

4把整個陣列分成了倆部分,2 1 3,7 5 6 8,再遞迴對這倆部分分別快速排序。

i p/j

2   1   3(主元)

2與2互換,不變,然後又是1與1互換,還是不變,最後,3與3互換,不變,

最終,3把2 1 3,分成了倆部分,2 1,和3.

再對2 1,遞迴排序,最終結果成為了1 2 3.

7 5 6 8(主元),7、5、6、都比8小,所以第一趟,還是7 5 6 8,

不過,此刻8把7 5 6 8,分成了  7 5 6,和8.[7 5 6->5 7 6->5 6 7]

再對7 5 6,遞迴排序,最終結果變成5 6 7 8。

ok,所有過程,全部分析完成。

五、快速排序的最壞情況和最快情況。

最壞情況發生在劃分過程產生的倆個區域分別包含n-1個元素和乙個0元素的時候,

即假設演算法每一次遞迴呼叫過程中都出現了,這種劃分不對稱。那麼劃分的代價為o(n),

因為對乙個大小為0的陣列遞迴呼叫後,返回t(0)=o(1)。

估算法的執行時間可以遞迴的表示為:

t(n)=t(n-1)+t(0)+o(n)=t(n-1)+o(n). 

可以證明為t(n)=o(n^2)。

因此,如果在演算法的每一層遞迴上,劃分都是最大程度不對稱的,那麼演算法的執行時間就是o(n^2)。

亦即,快速排序演算法的最壞情況並不比插入排序的更好。

此外,當陣列完全排好序之後,快速排序的執行時間為o(n^2)。

而在同樣情況下,插入排序的執行時間為o(n)。

//注,請注意理解這句話。我們說乙個排序的時間複雜度,是僅僅針對乙個元素的。

//意思是,把乙個元素進行插入排序,即把它插入到有序的序列裡,花的時間為n。

再來證明,最快情況下,即partition可能做的最平衡的劃分中,得到的每個子問題都不能大於n/2.

因為其中乙個子問題的大小為|_n/2_|。另乙個子問題的大小為|-n/2-|-1.

在這種情況下,快速排序的速度要快得多。為,

t(n)<=2t(n/2)+o(n).可以證得,t(n)=o(nlgn)。

直觀上,看,快速排序就是一顆遞迴數,其中,partition總是產生9:1的劃分,

總的執行時間為o(nlgn)。各結點中示出了子問題的規模。每一層的代價在右邊顯示。

每一層包含乙個常數c。

完。

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

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

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

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

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

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