排序演算法總結

2021-09-24 19:49:06 字數 5539 閱讀 3716

常見的排序方式有6種:

---簡單排序裡面的有:插入排序、選擇排序、氣泡排序,時間複雜度為o(n^2)

---線性對數階的排序: 歸併排序(merge sort),快速排序,堆排序,時間複雜度為o(nlogn)

在n<=50的情況下,最好使用插入排序或者選擇排序,由於選擇排序移動次數比插入排序少,在資料量比較多的情況,推薦使用選擇排序。

如果序列基本上正序了,則使用插入排序、氣泡排序或者隨機的快速排序

在n非常大的情況下,使用o(nlogn)的演算法,即歸併排序、快速排序、堆排序。後2者是不穩定的排序,而merge排序是穩定的排序方式,快速排序是基於比較的排序中的最好的排序方法。

實驗條件下演算法執行時間:(單位毫秒,10萬隨機數)

氣泡排序: 56953

選擇排序: 20109

插入排序: 14547

歸併排序: 134

堆排序: 67

快速排序: 28

三種o(nlogn)的排序時間比較為:

排序演算法 10萬 100萬 1000萬

歸併排序 134 1309 13985

堆排序 67 865 14292

快速排序 28 513 9815

幾種排序演算法介紹

一、插入排序(insertion sort)

1. 基本思想:

每次將乙個待排序的資料元素,插入到前面已經排好序的數列中的適當位置,使數列依然有序;直到待排序資料元素全部插入完為止。

2. 排序過程:

【示例】:

[初始關鍵字] [49] 38 65 97 76 13 27 49

j=2(38) [38 49] 65 97 76 13 27 49

j=3(65) [38 49 65] 97 76 13 27 49

j=4(97) [38 49 65 97] 76 13 27 49

j=5(76) [38 49 65 76 97] 13 27 49

j=6(13) [13 38 49 65 76 97] 27 49

j=7(27) [13 27 38 49 65 76 97] 49

j=8(49) [13 27 38 49 49 65 76 97]

1. procedure insertsort(var r : filetype);

2. //對r[1..n]按遞增序進行插入排序, r[0]是監視哨//

3. begin

4. for i := 2 to n do //依次插入r[2],...,r[n]//

5. begin

6. r[0] := r; j := i - 1;

7. while r[0] < r[j] do //查詢r的插入位置//

8. begin

9. r[j+1] := r[j]; //將大於r的元素後移//

10. j := j - 1

11. end

12. r[j + 1] := r[0] ; //插入r //

13. end

14. end; //insertsort //

複製**

二、選擇排序

1. 基本思想:

每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

2. 排序過程:

【示例】:

初始關鍵字 [49 38 65 97 76 13 27 49]

第一趟排序後 13 [38 65 97 76 49 27 49]

第二趟排序後 13 27 [65 97 76 49 38 49]

第三趟排序後 13 27 38 [97 76 49 65 49]

第四趟排序後 13 27 38 49 [49 97 65 76]

第五趟排序後 13 27 38 49 49 [97 97 76]

第六趟排序後 13 27 38 49 49 76 [76 97]

第七趟排序後 13 27 38 49 49 76 76 [ 97]

最後排序結果 13 27 38 49 49 76 76 97

1. procedure selectsort(var r : filetype); //對r[1..n]進行直接選擇排序 //

2. begin

3. for i := 1 to n - 1 do //做n - 1趟選擇排序//

4. begin

5. k := i;

6. for j := i + 1 to n do //在當前無序區r[i..n]中選最小的元素r[k]//

7. begin

8. if r[j] < r[k] then k := j

9. end;

10. if k <> i then //交換r和r[k] //

11. begin temp := r; r := r[k]; r[k] := temp; end;

12. end

13. end; //selectsort //

複製**

三、氣泡排序(bubblesort)

1. 基本思想:

兩兩比較待排序資料元素的大小,發現兩個資料元素的次序相反時即進行交換,直到沒有反序的資料元素為止。

2. 排序過程:

設想被排序的陣列r[1..n]垂直豎立,將每個資料元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r,凡掃瞄到違反本原則的輕氣泡,就使其向上"漂浮",如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。

【示例】:

49 13 13 13 13 13 13 13

38 49 27 27 27 27 27 27

65 38 49 38 38 38 38 38

97 65 38 49 49 49 49 49

76 97 65 49 49 49 49 49

13 76 97 65 65 65 65 65

27 27 76 97 76 76 76 76

49 49 49 76 97 97 97 97

1. procedure bubblesort(var r : filetype) //從下往上掃瞄的起泡排序//

2. begin

3. for i := 1 to n-1 do //做n-1趟排序//

4. begin

5. noswap := true; //置未排序的標誌//

6. for j := n - 1 downto 1 do //從底部往上掃瞄//

7. begin

8. if r[j+1]< r[j] then //交換元素//

9. begin

10. temp := r[j+1]; r[j+1 := r[j]; r[j] := temp;

11. noswap := false

12. end;

13. end;

14. if noswap then return//本趟排序中未發生交換,則終止演算法//

15. end

16. end; //bubblesort//

複製**

四、快速排序(quick sort)

1. 基本思想:

在當前無序區r[1..h]中任取乙個資料元素作為比較的"基準"(不妨記為x),用此基準將當前無序區劃分為左右兩個較小的無序區:r[1..

i-1]和r[i+1..h],且左邊的無序子區中資料元素均小於等於基準元素,右邊的無序子區中資料元素均大於等於基準元素,而基準x則位於最終排序的位置上,即r[1..i-1]≤x.

key≤r[i+1..h](1≤i≤h),當r[1..i-1]和r[i+1..

h]均非空時,分別對它們進行上述的劃分過程,直至所有無序子區中的資料元素均已排序為止。

2. 排序過程:

【示例】:

初始關鍵字 [49 38 65 97 76 13 27 49]

第一次交換後

[27 38 65 97 76 13 49 49]

第二次交換後

[27 38 49 97 76 13 65 49]

j向左掃瞄,位置不變,第三次交換後

[27 38 13 97 76 49 65 49]

i向右掃瞄,位置不變,第四次交換後

[27 38 13 49 76 97 65 49]

j向左掃瞄

[27 38 13 49 76 97 65 49]

(一次劃分過程)

初始關鍵字

[49 38 65 97 76 13 27 49]

一趟排序之後

[27 38 13] 49 [76 97 65 49]

二趟排序之後

[13] 27 [38] 49 [49 65]76 [97]

三趟排序之後 13 27 38 49 49 [65]76 97

最後的排序結果 13 27 38 49 49 65 76 97

各趟排序之後的狀態

1. procedure parttion(var r : filetype; l, h : integer; var i : integer);

2. //對無序區r[1,h]做劃分,i給以出本次劃分後已被定位的基準元素的位置 //

3. begin

4. i := 1; j := h; x := r ;//初始化,x為基準//

5. repeat

6. while (r[j] >= x) and (i < j) do

7. begin

8. j := j - 1 //從右向左掃瞄,查詢第1個小於 x的元素//

9. if i < j then //已找到r[j] 〈x//

10. begin

11. r := r[j]; //相當於交換r和r[j]//

12. i := i + 1

13. end;

14. while (r <= x) and (i < j) do

15. i := i + 1 //從左向右掃瞄,查詢第1個大於 x的元素///

16. end;

17. if i < j then //已找到r > x //

18. begin r[j] := r; //相當於交換r和r[j]//

19. j := j - 1

20. end

21. until i = j;

22. r := x //基準x已被最終定位//

23. end; //parttion //

複製**

1. procedure quicksort(var r :filetype; s,t: integer); //對r[s..t]快速排序//

2. begin

3. if s < t then //當r[s..t]為空或只有乙個元素是無需排序//

4. begin

5. partion(r, s, t, i); //對r[s..t]做劃分//

6. quicksort(r, s, i-1);//遞迴處理左區間r[s,i-1]//

排序演算法總結

按平均時間將排序分為四類 1 平方階 o n2 排序 一般稱為簡單排序,例如直接插入 直接選擇和氣泡排序 2 線性對數階 o nlgn 排序 如快速 堆和歸併排序 3 o n1 階排序 是介於0和1之間的常數,即0 1,如希爾排序 4 線性階 o n 排序 如桶 箱和基數排序。各種排序方法比較 簡單...

排序演算法總結

熱2已有 2573 次閱讀 2009 09 01 13 23 填問卷贏好書華章讀者調研活動結果公布 一 選擇排序 1.基本思想 每一趟從待排序的資料元素中選出最小 或最大 的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。2.排序過程 示例 初始關鍵字 49 38 65 97 ...

排序演算法總結

9,3,5,1,6,2,8,4,7 3,5,1,6,2,8,4,7,9 3,1,5,2,6,4,7,8,9 1,3,2,5,4,6,7,8,9 1,2,3,4,5,6,7,8,9 1,2,3,4,5,6,7,8,9 1,2,3,4,5,6,7,8,9 1,2,3,4,5,6,7,8,9 快速排序 設...