快速排序演算法一、快速排序演算法的基本特性
時間複雜度: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 利用代入法可以求...