1、概述java
希爾排序(Shell's Sort)是插入排序的一種又稱「縮小增量排序」(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因D.L.Shell於1959年提出而得名。 git
排序方法 | 時間複雜度(平均) | 時間複雜度 (最壞) | 時間複雜度(最好) | 空間複雜度 | 穩定性 | 使用場景 |
---|---|---|---|---|---|---|
希爾排序 | O(N*(logN)2) | O(n2) | O(nlogn) | O(n) | 不穩定 | 中等數據規模 |
1.一、算法說明github
首先它把較大的數據集合分割成若干個小組(邏輯上分組),而後對每個小組分別進行插入排序,此時,插入排序所做用的數據量比較小(每個小組),插入的效率比較高算法
能夠看出,他是按下標相隔距離爲4分的組,也就是說把下標相差4的分到一組,好比這個例子中a[0]與a[4]是一組、a[1]與a[5]是一組...,這裏的差值(距離)被稱爲增量shell
每一個分組進行插入排序後,各個分組就變成了有序的了(總體不必定有序)數組
此時,整個數組變的部分有序了(有序程度可能不是很高)spa
而後縮小增量爲上個增量的一半:2,繼續劃分分組,此時,每一個分組元素個數多了,可是,數組變的部分有序了,插入排序效率一樣比高.net
同理對每一個分組進行排序(插入排序),使其每一個分組各自有序3d
最後設置增量爲上一個增量的一半:1,則整個數組被分爲一組,此時,整個數組已經接近有序了,插入排序效率高code
1.二、代碼實現
public static void shellSort(int[] a) { //希爾排序 int d = a.length; while (true) { d = d / 2; for (int x = 0; x < d; x++) { for (int i = x + d; i < a.length; i = i + d) { int temp = a[i]; int j; for (j = i - d; j >= 0 && a[j] > temp; j = j - d) { a[j + d] = a[j]; } a[j + d] = temp; } } if (d == 1) { break; } } }
代碼地址:地址 中的algorithm-001-sort中 ShellSort
參看地址:https://blog.csdn.net/qq_39207948/article/details/80006224
https://baike.baidu.com/item/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F/3229428?fr=aladdin