經典的排序演算法
這些天複習了排序這個模組,排序演算法在程式員的日常工作中是必不可少的,有時候我們不知不覺就用到了排序,這是因為進階語言系統已經比較完美的封裝和最佳化了排序演算法,並且在筆試,面試等方面我們都能見到它的身影。下面結合那本大三的教材:嚴版的《資料結構》,來說一說這幾個經典的排序演算法,如果有不對的歡迎指正。
首先我們還是先說基礎概念(按書上說的),萬變離不開概念,沒有概念沒有規矩,那可不行。
一、冒泡排序
二、直接選擇排序
三、直接插入排序
四、希爾排序
五、堆排序
六、歸併排序
七、快速排序
八、各種演算法效率比拼
1:內部排序和外部排序(我們重點說內部排序(因為我們最常用到)) 內排序:在排序的時間資料對象全部存放在記憶體的排序。 外排序:在排序的時間對象個數太多,不能同時存放在記憶體,根據排序的要求,不斷在內、外存之間移動。
2:排序的方法 按所排列(移動交換)的方式不同,可歸納為五類:插入排序、選擇排序、交換排序、歸併排序和分配排序(有的書上直接說基數)。 插入排序主要包括直接插入排序和希爾排序兩種; 選擇排序主要包括直接選擇排序和堆排序; 交換排序主要包括冒泡排序和快速排序; 歸併排序主要包括二路歸併(常用的歸併排序)。 分配排序主要包括箱排序和基數排序。
3:穩定性 穩定排序:假設在待排序的檔案中,存在兩個或兩個以上的記錄具有相同的關鍵字,在用某種排序法排序後,若這些相同關鍵字的元素的相對次序仍然不變,則這種排序方法是穩定的。 冒泡,插入,基數,歸併屬於穩定排序; 選擇,快速,希爾,堆屬於不穩定排序。
4:圖表協助大家記憶:
| 各種排序演算法 |
| 類別 |
排序方法 |
時間複雜度 |
穩定性 |
| 平均情況 |
最好情況 |
最壞情況 |
| 插入排序 |
直接插入 |
O(n2) |
O(n) |
O(n2) |
穩定 |
希爾排序 |
O(n1.3) |
O(n) |
O(n2) |
不穩定 |
選擇排序 |
直接選擇 |
O(n2) |
O(n2) |
O(n2) |
不穩定 |
堆排序 |
O(nlog2n) |
O(nlog2n) |
O(nlog2n) |
不穩定 |
交換排序 |
冒泡排序 |
O(n2) |
O(n) |
O(n2) |
穩定 |
快速排序 |
O(nlog2n) |
O(nlog2n) |
O(n2) |
不穩定 |
歸併排序 |
O(nlog2n) |
O(nlog2n) |
O(nlog2n) |
穩定 |
基數排序 |
O(d(r+n)) |
O(d(n+rd)) |
O(d(r+n)) |
穩定 |
一、冒泡排序 冒泡排序也叫起泡排序,大家都知道,學C語言那會的迴圈結構就那這個做的例子,冒泡排序過程很簡單,但是效率太低。 1:簡要過程: 首先將一個記錄的關鍵字和第二個記錄的關鍵字比較若為逆序將兩個記錄交換,然後比較第二個記錄和第三個記錄的關鍵字....,直到n-1個記錄呢第n個記錄的關鍵字進行比較,上述過稱作一趟冒泡排序,然後進行第二趟,對n-1個記錄進行操作...(可以不安這種方法來,實際應用中可以逆序也可以正序) 2:排序效率: 如果開始的時候需要排序的元素是正序,則只要一趟,需要n-1次的關鍵字比較,如果為逆序要進行n(n-1)/2次的比較,所以時間複雜度是O(n2),所以效率超級的低,一般不建議使用 3:排序過程圖: 4:具體演算法實現(可以有多種形式):