希尔排序(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源创计划”,欢迎正在阅读的你也加入,一块儿分享。动画