快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 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...