希尔排序

一、排序思想

希尔排序的思想是“饭要一口一口吃,序要一批一批排”。

二、结合例子,具体分析

     文艺的话,肯定得写在最前面,接下来我们直奔主题,看看什么是希尔排序(刚开始看名字我还以为多牛逼的排序呢)。

我们来看这样的一个数组

a[ ]={81,94,11,96,12,35,17,95,28,58,41,75,15}

81 94 11 96 12 35 17 95 28 58 41 75 15
首先咱们来一个5间隔的排序,什么是5间隔呢?拿这个题举个例子

从第一个数81开始,间隔五个取到35,再从35出发间隔5个取到41.然后我们先对81.35.41做插入排序得到:

35 41 81

接着,咱们从94开始做5间隔的排序,过程和开始一样,取到94,17,75,做插入排序后得到:

35 17 41 75 81 94

然后,咱们从11开始做5间隔的排序,过程和开始一样,取到11,95,15做插入排序后得到:

35 17 11 41 75 15 81 94 95

再次,咱们从96开始做5间隔的排序,过程和开始一样,取到96,28做插入排序后得到:

35 17 11 28 41 75 15 96 81 94 95

最后,咱们从12开始做5间隔的排序,过程和开始一样,取到12,58做插入排序,这已经整个5间隔排序已经做完,整个数组5间隔排序后的情况是:
35 17 11 28 12 41 75 15 96 58 81 94 95

接下来我们对做好5间隔排序的数组做一次3间隔排序
过程和5间隔排序完全相同,只不过排序的间隔设置成3而已,所以对排好的
5间隔进行3间隔排序的结果是:
28 12 11 35 15 41 58 17 94 75 81 96 95

    如果你是好奇宝宝可以想一想,3间隔排序后是否破坏了5间隔排序的成果呢?也就是3间隔排序后的数组,5间隔还是有序的吗?

答案:没有破坏,如果破坏了,咱们希尔排序就不用玩了,这是一个定理。

3间隔排序后的数组和原始数组对比,混乱度大大降低,用官方的话来说就是减少了逆序对。最后咱们来一次1间隔排序,也就是对3间隔排序后的数组来一次插入排序,这样我们整个希尔排序的就完事了,下面是结果。

11 12 15 17 28 35 41 58 75 81 94 95 96

三、代码演示
//Java语言

public class Sort_Test {
    public static void Shell_sort(int[] a){
        if(a==null||a.length==0){
            return;
        }//健壮性判断
        int d=0;
//这里首间隔通常取 a.length/2,后面的间隔依次是前面的二分之一
        for(d=a.length/2;d>0;d/=2){
            for(int p=d;p<a.length;p++){
                       int tmp=a[p];//摸一张牌,定义一个临时变量将其存储进来
                       int i;
                       for(i=p;i>=d&&a[i-d]>tmp;i-=d)
                          a[i]=a[i-d];//移除空位
                       a[i]=tmp;//新牌落位
                    }//希尔排序的内核就是插入排序
        }
    }

最后,我想说,我没找到插入表格所以例子数据格式不是很漂亮。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值