排序算法之希尔排序-优化后的插入排序

希尔排序的思想:将待排序的序列分成若干个子序列(由某一分量相隔的元素组成),分别对若干个子序列进行直接插入排序,之后依次缩小分量直到整个序列基本有序,再对整个序列进行直接插入排序,基于插入排序在基本有序的序列中效率极高,因此可以提高直接插入排序的效率。


建议看希尔排序前,先看明白直接插入排序!!!


关于希尔排序的各项信息:

  • 空间复杂度:O(1)
  • 时间复杂度:由于希尔排序的时间复杂度依赖于增量序列的函数,这是一个数学上尚未解决的问题,因此它的时间复杂度分析比较难,当n(序列长度)在某个特定范围时,希尔排序的时间复杂度约为O(n^1.3),最坏的时间复杂度是O(n^2)
  • 稳定性:相同的关键字记录可能会划分到不同的子序列中,可能会改变他们的相对次序,因此不稳定

举例如下:
当前有一个十个数的无序序列{49, 38, 65, 97, 26, 13, 27, 50, 55, 4}
我们将上文提到的分量命名为gap

  1. 第一次 gap=10/2=5,即从头到尾将相距gap个位置的元素放入同一个子序列中:{49,13},{38,27},{65,50},{97,55},{26,4}
    对各个子序列进行直接插入排序得到:
    {13,27,50,55,4,49,38,65,97,26}
  2. 第二次 gap=5/2=2,得到子序列:
    {13,50,4,38,97},{27,55,49,65,26}
    对子序列进行插入排序:
    {4,26,13,27,38,49,50,55,97,65}

  3. 第三次gap=2/2=1,得到子序列:
    {4,26,13,27,38,49,50,55,97,65}
    对子序列进行插入排序:
    {4,13,26,37,38,49,50,55,65,97}
    gap等于1并插入排序后,整个排序过程结束,得到有序序列

代码如下:

    //希尔排序,先对数组进行分段直接插入排序,之后再对整个较为有序的数组进行排序
    public void shellSort1(int[] a, int n) {

        for(int gap=n/2; gap > 0; gap/=2) {

            for(int i=gap; i<n; i++) {

                if(a[i] < a[i-gap]) {
                    int temp = a[i];
                    int j;

                    for(j=i-gap; j>=0 && a[j]>temp; j-=gap) {
                        a[j+gap] = a[j];
                    }
                    a[j+gap] = temp;
                }
            }
        }

        System.out.println(Arrays.toString(a));
    }

测试代码如下:

public static void main(String[] args) {
        int[] a = new int[]{2,5,1,3,6};
        ShellSort ss = new ShellSort();

        ss.shellSort1(a, a.length);
    }

测试结果:

[1, 2, 3, 5, 6]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值