数据结构:插入排序中的希尔排序

希尔排序

一、概念及其介绍

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

二、适用说明

希尔排序时间复杂度是 O(n^(1.3-2)),只使用了常数个辅助单元,因而空间复杂度为常数阶 O(1)

希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多

三、过程图示

希尔排序目的为了加快速度改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。

在此我们选择增量  步长dk=length/2,缩小增量以 dk = dk/2 的方式,用序列 {n/2,(n/2)/2...1} 来表示。

如图示例:

(1)初始增量第一趟 dk= length/2 = 4

(2)第二趟,增量缩小为 2

(3)第三趟,增量缩小为 1,得到最终排序结果

public class InsertSort {

    public static void main(String[] arg) {
        int[] a=new int[] {49,38,65,97,76,13,27};
        int n=a.length;
        InsertSort2(a,n);
    }
 static void InsertSort2(int a[],int n){
        //dk是步长
        int dk,i,j;
        //中间转换变量
        int temp;
        //获取步长,步长随着每次循环逐渐减小,n是数组的长度
        for (dk=n/2;dk>=1;dk=dk/2){
            //开始比较每个相隔步长dk的两个数
            for (i=dk;i<n;++i){
                //比较a[i]<a[i-dk],例如步长为4的话第一次比较就是判断a[4]<a[0]
                if (a[i]<a[i-dk]){
                    //暂存在temp
                    temp=a[i];
                    //这里注意j>=0,和王道考研数据结构有差别,他总是a[0]不放值,作为中间变量
                     for (j=i-dk;j>=0&&temp<a[j];j-=dk){
                         //循环插入值,例如a[4]=a[0]
                         a[j+dk]=a[j];
                     }
                     //中间变量赋值插入刚才被覆盖的a[j+dk]
                     a[j+dk]=temp;
                }

            }
            //遍历打印每一次希尔排序的结果
            for(int c=0;c<n;c++) {
                System.out.print(a[c]+" ");
            }

            //第几次排序
            System.out.println("步长为:"+dk);

        }
   }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值