C 高速排序演算法

2021-09-26 07:53:58 字數 2510 閱讀 2588

根據網上看到的高速排序演算法介紹,進行的**實現。目前的**還是比較粗糙和繁瑣的,等待後續改進~

(下面的文字介紹部分**於

一、高速排序演算法的基本特性

時間複雜度: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...