一、插入排序的主要分類:
1、直接插入排序;
2、折半插入排序;
3、2-路插入排序;
4、希爾排序(縮小增量排序)。
二、直接插入排序(簡便,容易實現):
1、排序過程:整個排序過程為n-1趟插入,即先將序列中第1個元素看成是乙個有序子串行,然後從第2個元素開始,逐個進行插入,直至整個序列有序。
2、演算法實現:
3、演算法評價:
(1) 時間複雜度
——若待排序元素按關鍵字從小到大排列(正序)
關鍵字比較次數:n-1
元素移動次數:0
——若待排序元素按關鍵字從大到小排列(逆序)
關鍵字比較次數:n*(n-1)/2 注意:上面演算法並沒設定哨兵
,若有設定,則比較次數應為(n+2)(n-1)/2
元素移動次數:n*(n-1)/2 注意:上面演算法並沒設定哨兵
,若有設定,則移動次數應為(n+4)(n-1)/2
——若待排序元素是隨機的,取平均值
關鍵字比較次數:(n+2)(n-1)/4
元素移動次數:n*(n-1)/4
故時間複雜度為:t(n)=o(n²)
(2)空間複雜度:s(n)=o(1)
4、適應範圍:當序列中元素的個數n很少時。
三、折半插入排序(減少了元素的比較次數):
1、排序過程:用折半查詢方法確定插入位置。
2、演算法實現:
3、演算法評價:
(1) 時間複雜度:
折半插入排序減少了關鍵字比較的次數,而元素的移動次數不變,故時間複雜度仍然為:t(n)=o(n²)
(2)空間複雜度:s(n)=o(1)
4、適應範圍:當序列中元素的個數n很大時。
四、2-路插入排序(減少了元素的移動次數,但是增加了空間複雜度):
1、排序過程:引進乙個空序列b。把原序列中的第乙個元素a[0]看成是處於排好後的序列的中間。大於a[0]的元素放於a[0]值前的有序序列中,反之,放於其後。
如下圖例子:
2、演算法實現:
3、演算法評價:
(1) 時間複雜度:時間複雜度仍然為:t(n)=o(n²)。(然而元素的移動次數約n*n/8)
(2)空間複雜度:s(n)=o(n)。
五、希爾插入排序(縮小增量法)(減少了元素的比較次數):
1、排序過程:分割成若干個較小的子檔案,對各個子檔案分別進行直接插入排序,當檔案達到基本有序時,再對整個檔案進行一次直接插入排序。
如下圖例子:
2、演算法實現:
3、演算法評價:
(1) 時間複雜度:在時間效率上較上述幾種排序方法有較大的提高。時間複雜度效率介於o(n)與o(n*n)之間。
(2)空間複雜度:s(n)=o(1)。
4、補充說明:希爾排序的分析乙個複雜的問題,因為它的時間複雜度與所取的增量序列有關,涉及到了數學上一些尚未解決的問題。因此到目前都沒有人求出最好的增量序列。但是,應該使增量序列中沒有除1外的公因子,並且最後乙個增量值必須為1。
本文若有錯誤或者不足之處,請您不吝指正。謝謝。
排序之插入排序
基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前邊已經排好序的子陣列中的適當位置,知道全部記錄插入完成為止。分類 直接插入排序和希爾 shell 排序。一 直接插入排序 基本操作 將當前無序區的第乙個記錄r i 插入到有序區r 1.i 1 中適當的位置,使得r 1.i 變為新的有序區。每次使...
排序之插入排序
本人是純正的蒟蒻。寫這些部落格目的是為了複習一些基礎知識,同時也幫助一下比我還要弱的蒟蒻 估計沒有 排序 排序有很多種,這裡先介紹幾種最基本,最簡單的。一.插入排序 主要思想 假設前面n個元素已經有序排列,現在要插入乙個元素,使這n 1個元素有序,先在原有序列中找到應該插入的位置,然後把這個位置的數...
排序之插入排序
插入演算法 迴圈陣列,以指標資料為基值 並且記錄,通過和左側 右側 的迴圈比較,當比較值大於 小於 基值時 將大的值至後,指標繼續移動,比較,置換。直到遇到小於基值,或者到陣列邊界時截止,並且置換至首位。結束一次內迴圈,這是外迴圈的指標左側的是有序。class sort public static ...