简介

  希尔排序算法是插入排序算法的一种,又叫做缩小增量排序算法,是插入排序算法的一种更高效的改进版本,是非稳定排序。希尔排序算法将数据序列按下标的一定增量进行分组,对每组使用插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

原理

  希尔排序算法的具体做法为:假设待排序元素序列有N个元素,取一个小于N的整数增量值incremen作为间隔,将全部元素分为increment个子序列,将所有距离为increment的元素放在一个序列中,并对每一个序列执行直接插入排序。然后缩小increment,重复上述划分子序列和排序的过程,直到最后increment为1,再执行一次直接插入排序,此时序列已经有序,算法终止。

  由于increment开始取的值较大,但每个子序列中的元素较少,排序速度较快。到了排序后期,increment值逐渐变小,子序列中元素逐渐增多,但由于前面的工作使得整个序列大部分元素都是有序的,减少了元素移动的次数,排序仍然是较快的。

 

程序

public class ShellSort {
    public static void sort(int[] arr){
        int dk = arr.length / 2;
        while(dk > 0){
            shellSort(arr, dk);
            dk = dk / 2;
        }
    }
    public static void shellSort(int[] arr, int dk){
        for(int i = dk; i < arr.length; ++i){
            int index = i - dk;
            int insertNum = arr[i];
            while(index >= 0 && arr[index] > insertNum){
                arr[index + dk] = arr[index];
                index -= dk;
            }
            arr[index + dk] = insertNum;
        }
    }
}

总结

  希尔排序的时间复杂度最差为O(n^2),最好情况时O(n),平均时间复杂度为O(n^1.3)。

  希尔排序空间复杂度O(1)。

  由于希尔排序会将元素分组再执行插入排序,组内排序后会改变元素在整个数组的顺序,所以希尔排序是不稳定的。

 

版权声明:本文为silentteller原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/silentteller/p/12764968.html