排序演算法總結

2021-12-21 16:35:13 字數 2734 閱讀 9095

熱2已有 2573 次閱讀 2009-09-01 13:23

填問卷贏好書華章讀者調研活動結果公布

一、選擇排序

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

3.void selectionsort(type* arr,long len)

}選擇排序法的第一層迴圈從起始元素開始選到倒數第二個元素,主要是在每次進入的第二層迴圈之前,將外層迴圈的下標賦值給臨時變數,接下來的第二層迴圈中,如果發現有比這個最小位置處的元素更小的元素,則將那個更小的元素的下標賦給臨時變數,最後,在二層迴圈退出後,如果臨時變數改變,則說明,有比當前外層迴圈位置更小的元素,需要將這兩個元素交換.

二.直接插入排序

插入排序(insertion sort)的基本思想是:每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。

直接插入排序

直接插入排序(straight insertion sort):將乙個記錄插入到排好序的有序表中,從而得到乙個新的、記錄數增1的有序表。

直接插入排序演算法

哨兵(監視哨)有兩個作用:一是作為臨變數存放r[i](當前要進行比較的關鍵字)的副本;二是在查詢迴圈中用來監視下標變數j是否越界。

當檔案的初始狀態不同時,直接插入排序所耗費的時間是有很大差異的。最好情況是檔案初態為正序,此時演算法的時間複雜度為o(n),最壞情況是檔案初態為反序,相應的時間複雜度為o(n2),演算法的平均時間複雜度是o(n2)。演算法的輔助空間複雜度是o(1),是乙個就地排序。

直接插入排序是穩定的排序方法。

三. 氣泡排序

[演算法思想]:將被排序的記錄陣列r[1..n]垂直排列,每個記錄r[i]看作是重量為r[i].

key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r:凡掃瞄到違反本原則的輕氣泡,就使其向上"飄浮"。

如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。

[演算法]:

void bubblesort(seqlist r) //bubblesort

[分析]:起泡排序的結束條件為:最後一趟沒有進行「交換」。

從起泡排序的過程可見,起泡排序是乙個增加有序序列長度的過程,也是乙個縮小無序序列長度的過程,每經過一趟起泡,無序序列的長度只縮小1。 [演算法思想]:將被排序的記錄陣列r[1..

n]垂直排列,每個記錄r[i]看作是重量為r[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r:

凡掃瞄到違反本原則的輕氣泡,就使其向上"飄浮"。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。

[演算法]:

void bubblesort(seqlist r) //bubblesort

[分析]:起泡排序的結束條件為:最後一趟沒有進行「交換」。

從起泡排序的過程可見,起泡排序是乙個增加有序序列長度的過程,也是乙個縮小無序序列長度的過程,每經過一趟起泡,無序序列的長度只縮小1。

四. 希爾排序

基本思想:

先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插人排序;然後,取第二個增量d2  該方法實質上是一種分組插入方法。

給定例項的shell排序的排序過程

假設待排序檔案有10個記錄,其關鍵字分別是:

49,38,65,97,76,13,27,49,55,04。

增量序列的取值依次為:

5,3,1

shell排序的演算法實現

1. 不設監視哨的演算法描述

void shellpass(seqlist r,int d)

//shellpass

void shellsort(seqlist r)

while(increment>1)

} //shellsort

注意:  當增量d=1時,shellpass和insertsort基本一致,只是由於沒有哨兵而在內迴圈中增加了乙個迴圈判定條件"j>0",以防下標越界。

2.設監視哨的shell排序演算法

演算法分析

1.增量序列的選擇

shell排序的執行時間依賴於增量序列。

好的增量序列的共同特徵:

① 最後乙個增量必須為1;

② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。

有人通過大量的實驗,給出了目前較好的結果:當n較大時,比較和移動的次數約在nl.25到1.6n1.25之間。

2.shell排序的時間效能優於直接插入排序

希爾排序的時間效能優於直接插入排序的原因:

①當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。

排序演算法總結

常見的排序方式有6種 簡單排序裡面的有 插入排序 選擇排序 氣泡排序,時間複雜度為o n 2 線性對數階的排序 歸併排序 merge sort 快速排序,堆排序,時間複雜度為o nlogn 在n 50的情況下,最好使用插入排序或者選擇排序,由於選擇排序移動次數比插入排序少,在資料量比較多的情況,推薦...

排序演算法總結

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

排序演算法總結

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 快速排序 設...