排序算法——希尔排序

   希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。


希尔排序是基于插入排序的如下两点性质而提出改进方法的:java


  1. 插入排序在对几乎已经排好序的数据操做时,效率高,便可以达到线性排序的效率。web

  2. 但插入排序通常来讲是低效的,由于插入排序每次只能将数据移动一位。算法

希尔排序动画演示

数组由{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[] {731954286};
    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源创计划”,欢迎正在阅读的你也加入,一块儿分享。动画

相关文章
相关标签/搜索