我們將需要劃分的目標區間定位[l, u]。
首先給定目標值t = x[l]。我們需要重新組織x[l...u],使得所有小於t的元素都在m的一端,所有大於t的元素在m的另一端。
初始時m = l,我們將i從l+1一直遍歷到u,**在檢測第i個元素時必須考慮兩種情況。如果x[i]>=t,那麼一切正常,不變式為真;如果x[i]
void q_sort_ori(int *a, int low, int high)
} swap(a[m],a[low]);
for(int i = 0; i <= 7; i++)
cout<
下標i和j初始化為待劃分陣列的兩端。主迴圈中有兩個內迴圈,第乙個內迴圈將i向右移過小元素,遇到大元素時停止;第二個內迴圈將j向左移過大元素,遇到小元素時停止。然後主迴圈測試這兩個下標是否交叉並交換它們的值。這樣做雖然交換的次數增加了,但卻將所有元素都相同的最壞情況變成了差不多需要nlog2n次比較的最好情況
void qsort2(int *a, int low, int high)
while (a[j] > tmp)
if (i <= j)
}swap(a[low], a[j]);
for(int i = 0; i <= 7; i++)
coutqsort2(a,0,7);
for(int i = 0; i <= 7; i++)
cout<
插入排序 《程式設計珠璣》
插入排序法 插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度 為o n 2 是穩定的排序方法。插入演算法把要排序的 陣列分成兩部分 第一部分包含了這個陣列的所有元素,但將最後乙個元素除外,而第二部分就只包含這乙...
程式設計珠璣 位排序 bitsort
在 程式設計珠璣 一書上,有一題是將一堆不重複的數進行排序,這些數的值大小位於 0,10000000 然後作者在書後給出的答案確實很精闢,利用位排序將這個問題輕而易舉的解決了。首先弄懂i shift相當於i 32,i mask相當於i 32.題目中說了 replace above 2lines wi...
程式設計珠璣之取樣問題
要從0 n 1的整數中取出來m m第二種演算法和以前一篇的洗盤演算法比較相似,但是並不是嚴格的每個數字取到的概率為m n,演算法是這樣的,先生成乙個n維的整數陣列,a值為0 n 1,然後生成m個n內的隨機整數rand,然後交換a i 和a rand i 0.m 1 至於是否是滿足m n證明好像有點難...