快速排序是基於分治策略的排序演算法,基本思想是,對於輸入的子陣列a[p:r],按照以下三個步驟進行排序:
(1)分解:以元素a[p]為基準元素,將a[p:r]中比元素a[p]小的元素移動到a[p]的左邊,比元素a[p]大的元素移動到a[p]的右邊,記錄分解完成後a[p]的下標q;
(2)遞迴求解:通過遞迴呼叫快速排序演算法,分別對子陣列a[p:q-1]和a[q+1:r]進行排序;
(3)合併:不需要合併演算法,因為排序是就地進行的。當遞迴完成後,陣列就已經排好序.
#include using namespace std;
//劃分函式,以x為基準將陣列劃分成左右中三個部分,左邊都是比x小的,右邊都是比x大的,中間是x,返回x的下標
int partition(int num,int left,int right)
//如果兩者相等則跳過
for(int i=left;i<=right;i++)
cout<=right)return;
int x = partition(num,left,right);
quicksort(num,left,x-1);
quicksort(num,x+1,right);
}int main()
; quicksort(num,0,11);
for(int i=0;i<12;i++)
cout《複雜性分析:最壞情況下劃分函式partition每次執行需要o(n)時間,遞迴函式滿足t(n)=t(n-1)+o(n),解此遞迴方程可得t(n)=o(n^2);最好情況下,每次劃分所取的值都恰好是中值,即每次劃分產生兩個n/2的子區域,則t(n)=2t(n/2)+o(n),解此遞迴方程可得t(n)=o(n(logn);
演算法 排序演算法之快速排序
很受打擊啊啊啊啊啊!這道排序題我很久之前就做過,而且當時沒用20分鐘就搞定了,可是,今天在公司做完手上的活之後打算刷題時,又心血來潮的想重做一遍,心想反正也花不了多少時間,結果。血崩了。要求 對於乙個int陣列,請編寫乙個快速排序演算法,對陣列元素排序。給定乙個int陣列a及陣列的大小n,請返回排序...
演算法 排序演算法之快速排序
快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 nlogn 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 nlogn 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實現出來。快速排序...
排序演算法之快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...