演算法 快速排序演算法

2021-07-23 11:41:17 字數 1548 閱讀 4984

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

從數列中挑出乙個元素,稱為 「基準」(pivot)。

重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

快速排序是基於分治模式處理的,對乙個典型子陣列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.合併。

快速排序偽**(來自演算法導論)

quick_sort(a,p,r)

if(pa[j]

exchange a[i+1]<——>a[r]

return i+1

示例:對以下陣列,進行快速排序,下圖示出了patition過程。

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

include int partition(int *arr,int low,int high)

{ int pivot=arr[high];

int i=low-1;

int j,tmp;

for(j=low;j最壞情況發生在劃分過程產生的倆個區域分別包含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)。

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

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

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

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

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

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

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

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

演算法 快速排序演算法

快速排序的思想是 選取乙個樞軸值,一趟排序後,將待排序列分成兩部分,左邊部分均不大於這個樞軸值,右邊部分均不小於這個樞軸值。然後再次對兩側進行快速排序,直至整個序列有序。例項 include stdio.h define maxsize 10 int data maxsize void swap i...