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)
演算法,但是通常情況下速度要慢
於快速排序(因為要重組堆)。
排序 快速排序(C )
1 演算法描述 1.1 設當前參加排序的陣列為array 0.n 1 選擇乙個元素 通常稱該元素為基準元素 作為基準元素 將小於或者等於基準元素的所有元素都移到基準元素的左邊 把大於或者等於基準元素的所有元素都移到分界元素的右邊 執行完 2 3 步驟後,基準元素左邊元素序列,基準元素,基準元素右邊元...
排序 快速排序(C )
如果看不懂這些乾巴巴的理 字,那就先不用看了,下面 中有詳細的注釋,大家可以先跟著 走幾遍,回過頭來再看這些文字描述,總之 紙上得來終覺淺,絕知此事要躬行。排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分...
快速排序 c
快速排序應該是目前最快,也是最常用的一種排序演算法。它將乙個集合劃分成兩個子集合,然後繼續遞迴來完成最終排序。具體做法 1.選取集合最右端的元素作為乙個參照物,稱之為 樞紐 pivot 2.開始計算分割位置。在計算時,進行元素交換,確保左側元素都小於樞紐,而右側都大於樞紐。3.根據分割位置,分別遞迴...