根據網上看到的高速排序演算法介紹,進行的**實現。目前的**還是比較粗糙和繁瑣的,等待後續改進~
(下面的文字介紹部分**於
一、高速排序演算法的基本特性
時間複雜度:o(nlgn)
最壞:o(n^2)
空間複雜度:o(nlgn)
不穩定。
高速排序是一種排序演算法,對包括n個數的輸入陣列,平均時間為o(nlgn),最壞情況是o(n^2)。
一般是用於排序的最佳選擇。由於,基於比較的排序,最快也僅僅能達到o(nlgn)。
二、高速排序演算法的描寫敘述
演算法導論,第7章
高速排序時基於分治模式處理的,
對乙個典型子陣列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.合併。
三、高速排序演算法
版本號一:
quicksort(a, p, r)
1 if p < r
2 then q ← partition(a, p, r) //關鍵
3 quicksort(a, p, q - 1)
4 quicksort(a, q + 1, r)
陣列劃分
高速排序演算法的關鍵是partition過程,它對a[p…r]進行就地重排:
partition(a, p, r)
1 x ← a[r]
2 i ← p - 1
3 for j ← p to r - 1
4 do if a[j] ≤ x
5 then i ← i + 1
6 exchange a[i] a[j]
7 exchange a[i + 1] a[r]
8 return i + 1
ok,咱們來舉乙個詳細而完整的樣例。
來對下面陣列,進行高速排序,
2 8 7 1 3 5 6 4(主元)
一、i p/j
2 8 7 1 3 5 6 4(主元)
j指的2<=4,於是i++,i也指到2,2和2互換,原陣列不變。
j後移,直到指向1…
二、j(指向1)<=4,於是i++
i指向了8,所以8與1交換。
陣列變成了:
i j2 1 7 8 3 5 6 4
三、j後移,指向了3,3<=4,於是i++
i這是指向了7,於是7與3交換。
陣列變成了:
i j2 1 3 8 7 5 6 4
四、j繼續後移,發現沒有再比4小的數,所以,執行到了最後一步,
即上述partition(a, p, r)**部分的 第7行。
因此,i後移乙個單位,指向了8
i j2 1 3 8 7 5 6 4
a[i + 1] a[r],即8與4交換,所以,陣列終於變成了例如以下形式,
2 1 3 4 7 5 6 8
ok,高速排序第一趟完畢。
4把整個陣列分成了倆部分,2 1 3,7 5 6 8,再遞迴對這倆部分分別高速排序。
i p/j
2 1 3(主元)
2與2互換,不變,然後又是1與1互換,還是不變,最後,3與3互換,不變,
終於,3把2 1 3,分成了倆部分,2 1,和3.
再對2 1,遞迴排序,終於結果成為了1 2 3.
7 5 6 8(主元),7、5、6、都比8小,所以第一趟,還是7 5 6 8,
只是,此刻8把7 5 6 8,分成了 7 5 6,和8.[7 5 6->5 7 6->5 6 7]
再對7 5 6,遞迴排序,終於結果變成5 6 7 8。
ok,全部過程,全部分析完畢。
//quicksort
#include #include #include #include using namespace std;
int times = 0;
void changevector(vector::iterator begin,vector::iterator end) }
vector::iterator s;
vector::iterator it = i;
changevector(begin,it-1);
changevector(it,end);
}int main()//generate 100 random figures
cout<
changevector(st.begin(),st.end());
cout<::iterator s>
for(s = st.begin();s != st.end();s++)
return 0;
}
高速排序演算法C 實現
quick sort stl中也有現成的高速排序演算法。內部實現採用了下面技巧 1 樞軸的選擇採取三數取中的方式 2 後半段採取迴圈的方式實現 3 高速排序與插入排序結合 include include includeusing namespace std 這一版本號是最簡單實現版本號。對於高速排序...
高速排序 與 隨機高速排序 演算法分析
高速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則須要 n2 次比較,但這樣的狀況並不常見。其實,高速排序通常明顯比其它 n log n 演算法更快,由於它的內部迴圈 inner loop 能夠在大部分的架構上非常有效率地被實現出來...
幾個高速排序演算法
鴿巢排序,排序位元組串 寬位元組串最快的排序演算法,計數排序的變種 將計數緩衝區大小固定,少一次遍歷開銷 速度是stl中std sort的20多倍,更重要的是實現極其簡單!缺點是需要乙個size至少等於待排序陣列取值範圍的緩衝區,不適合int等大範圍資料 c c code void pigeonho...