插入排序的理解以及希爾排序的實現

2021-10-07 20:42:19 字數 1736 閱讀 3165

1 插入排序的實現 

演算法思路:將陣列的第乙個數認為是有序陣列,從陣列的第二個元素開始將後面的元素依次插入到有序陣列的合適位置。

如下圖所示:

2 **實現

public static void main(string args) ;

for (int i = 1; i < arr.length; i++)

arr[j] = temp;// 把temp查到找到的位置 注意這裡是j 可以簡化直接考慮j=0的情況

3 希爾排序 

希爾排序,也稱遞減增量排序演算法,希爾排序是先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。

演算法思路:將待排序陣列按照步長gap進行分組,然後將每組的元素利用直接插入排序的方法進行排序;每次再將gap折半減小,迴圈上述操作;當gap=1時,利用直接插入,完成排序。可以看到步長的選擇是希爾排序的重要部分。只要最終步長為1任何步長序列都可以工作。一般來說最簡單的步長取值是初次取陣列長度的一半為增量,之後每次再減半,直到增量為1。

4 **實現

**思路

先求解陣列分組時用的步長,以陣列[9,8,7,6,5,4,3,2,1]為例,計算其步長為[4,2,1],陣列的長度每次除2,當然還有其他的計算方法,這裡就以最簡單的這種方式為例

按照步長進行分組,並進行插入排序,

第一次以步長為4進行分組  分組為  [9,5,1]     [8,4]    [7,3]    [6,2] ,對分好的組按插入排序進行排序

以第一組[9,5,1]   為例進行插入排序,實際排序陣列為  [9,  _,  _,  _,  5,   _,   _,  _, 1] 

排序結果   [1,  _,  _,  _,  5,   _,   _,  _, 9] 

按照步長為5進行排序完成後陣列結果為[1,4,3,2,5,8,7,6,9]

再按照步長為2 和 1分別進行排序

當按照步長為1排序時 實際就是直接插入排序,只不過這是的陣列的元素大部分已經是有序的了。

public static void mysort();// 測試用例

liststepsquence = new linkedlist<>();

int size = arr.length;

while ((size >>= 1) > 0)

for (int step : stepsquence)

arr[cur] = temp;// temp插入到合適的位置

}} }

system.out.println(arrays.tostring(arr));

}

4 希爾排序的步長

5 希爾排序的時間複雜度,希爾排序的時間複雜度與排序的步長取值有關,當按照上圖所示的步長進行排序時最壞情況為 n(4/3)

選擇排序,插入排序以及希爾排序

首先,找到陣列中最小的那個元素 將它與陣列中的第乙個元素交換位置 在剩下的陣列中找到最小的元素,和陣列的第二個元素交換位置,如此迴圈往復 public class selection exch a,i,min 陣列兩個元素比較 private static boolean less comparab...

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...

插入排序 希爾排序

我們知道當乙個序列基本有序時,直接插入會變得很高效。因為此時只需少量的移動元素,操作集中在元素的比較上。基於這種想法,我們就試圖把乙個序列在進行直接插入前調整得盡量有序。這就是希爾排序 shell sort 的核心思路。shell只是演算法發明者的名字,無特殊含義 那到底該怎麼做呢?希爾排序一反以前...