常見的排序方式有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 快速排序 設...