希爾排序(Shell's Sort)是插入排序的一種又稱「縮小增量排序」(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因 D.L.Shell 於 1959 年提出而得名。
希爾排序是基於插入排序的如下兩點性質而提出改進方法的:java
插入排序在對幾乎已經排好序的數據操做時,效率高,便可以達到線性排序的效率。web
但插入排序通常來講是低效的,由於插入排序每次只能將數據移動一位。算法
希爾排序動畫演示
數組由{7, 3, 1, 9, 5, 4, 2, 8, 6} 這9個無序元素組成。shell
第一次:gap = 9/2 = 4 動畫:數組
第二次:gap = 4/2 = 2 動畫:微信
第三次:gap = 2/2 = 1 動畫:app
代碼以下:學習
public class ShellSortTest2 {
public static void main(String[] args) {
int[] arr = new int[] {7, 3, 1, 9, 5, 4, 2, 8, 6};
shellSort(arr);
}
public static void shellSort(int[] arr) {
// 增量gap,經過gap來劃分出不一樣的子序列,gap不斷減小,劃分的子序列更多
for (int gap = arr.length / 2; gap > 0; gap /= 2) { // 循環獲得不一樣的gap,gap = 4, 2, 1
System.out.println("gap: " + gap);
for (int i = gap; i < arr.length; i++) { // 每組使用插入排序
for (int j = i; j-gap >= 0; j -= gap) {
if (arr[j-gap] > arr[j]) {
swap(arr, j-gap, j);
System.out.print("\t交換: " + arr[j-gap] + "和" + arr[j]);
System.out.println(Arrays.toString(arr));
}
}
}
}
}
public static void swap(int[] arr, int start, int end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
本文分享自微信公衆號 - Java學習進階手冊(javastudyup)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。動畫