天天看點

《資料結構》☞ 插入排序

基本思想:

     每步将一個待排序的對象,按其關鍵碼大小,插入到前面已經排好序的一組對象的适當位置上,直到對象全部插入為止。

     即邊插入邊排序,保證子序列中随時都是排好序的。

基本操作:有序插入

    在有序序列中插入一個元素,保持序列有序,有序長度不斷增加

    起初,a[0]是長度為1的子序列。然後,逐一将a[1]至a[n-1]插入到有序子序列中

有序插入方法:

      在插入a[i]前,數組a的前半段a[0]至a[i-1]是有序段,後半段a[i]至a[n-1]是停留于輸入次序的無序段

      插入a[i]使a[0]至a[i-1]有序,也就是要為a[i]找到有序位置j(0<=j<=i),将a[i]插入在a[j]的位置上

插入位置圖示:

1.插在中間

《資料結構》☞ 插入排序

2.插在最前面

《資料結構》☞ 插入排序

3.插在最後面

《資料結構》☞ 插入排序

如何找到插入位置呢?

     1.順序法定位插入位置  ---  直接插入排序

      2.二分法定位插入位置 ---  二分插入排序

      3.縮小增量多遍插入排序 --- 希爾排序

(1)直接插入排序  -- 采用順序法查找法查找插入位置

《資料結構》☞ 插入排序

因每次都需要判斷j是否越界,浪費時間消耗,是以可選擇采用了哨兵模式進行改進。哨兵避免了每次都要判斷越界的步驟。

(2)直接插入排序,使用哨兵

《資料結構》☞ 插入排序

直接插入排序 --- 性能分析

實作排序的基本操作有兩個:

(1)‘比較’序列中兩個關鍵字的大小

(2)‘移動記錄’

最好的情況(關鍵字在記錄序列中順序有序):

   11、 25、 32、 47、 56、 70、 81、 85、 92、 96

‘比較次數’:n-1     '移動次數':0

最壞情況(關鍵字在記錄序列中逆序有序)

96、92、85、81、70、56、47、32、25、11

‘比較’次數:1+2+3+......+n-1 = 

‘移動’次數:

時間複雜度結論:

原始資料越接近有序,排序速度越快

最壞情況下,(輸入資料是逆有序) Tw(n) = O(n^2)

平均情況下,耗時差不多是最壞情況的一半 Te(n) = O(n^2)

要提高查找速度

    減少元素的比較次數

    減少元素的移動次數

繼續閱讀