1.
快速排序:
#include
void run(int* pdata,int left,int right)
}while(i<=j);//
如果兩邊掃瞄的下標交錯,就停止(完成一次) //
當左邊部分有值
(lefti)
,遞迴右半邊
if(right>i)
run(pdata,i,right); }
void quicksort(int* pdata,int count)
void main() ;
quicksort(data,7);
for (int i=0;i<7;i++)
cout 這裡我沒有給出行為的分析,因為這個很簡單,我們直接來分析演算法:首先我們考慮最理想的情況 1. 陣列的大小是 2 的冪,這樣分下去始終可以被 2 整除。假設為 2 的k 次方,即 k=log2(n) 。 2. 每次我們選擇的值剛好是中間值,這樣,陣列才可以被等分。 第一層遞迴,迴圈 n 次,第二層迴圈 2*(n/2)...... 所以共有 n+2(n/2)+4(n/4)+...+n*(n/n) = n+n+n+...+n=k*n=log2(n)*n 所以演算法複雜度為 o(log2(n)*n) 其他的情況只會比這種情況差,最差的情況是每次選擇到的 middle 都是最小值或最大值,那麼他將變 成交換法(由於使用了遞迴,情況更糟)。但是你認為這種情況發生的機率有多大??呵呵,你完全 不必擔心這個問題。實踐證明,大多數的情況,快速排序總是最好的。 如果你擔心這個問題,你可以使用堆排序,這是一種穩定的 o(log2(n)*n) 演算法,但是通常情況下速度要慢 於快速排序(因為要重組堆)。 1 演算法描述 1.1 設當前參加排序的陣列為array 0.n 1 選擇乙個元素 通常稱該元素為基準元素 作為基準元素 將小於或者等於基準元素的所有元素都移到基準元素的左邊 把大於或者等於基準元素的所有元素都移到分界元素的右邊 執行完 2 3 步驟後,基準元素左邊元素序列,基準元素,基準元素右邊元... 如果看不懂這些乾巴巴的理 字,那就先不用看了,下面 中有詳細的注釋,大家可以先跟著 走幾遍,回過頭來再看這些文字描述,總之 紙上得來終覺淺,絕知此事要躬行。排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分... 快速排序應該是目前最快,也是最常用的一種排序演算法。它將乙個集合劃分成兩個子集合,然後繼續遞迴來完成最終排序。具體做法 1.選取集合最右端的元素作為乙個參照物,稱之為 樞紐 pivot 2.開始計算分割位置。在計算時,進行元素交換,確保左側元素都小於樞紐,而右側都大於樞紐。3.根據分割位置,分別遞迴...排序 快速排序(C )
排序 快速排序(C )
快速排序 c