插入排序和希尔排序(Java实现)

8 篇文章 0 订阅

1、插入排序
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。

2、插入排序Java代码实现

    /**
     * @Comment 插入排序
     * @Author Ron
     * @Date 2017年11月9日 上午11:53:06
     * @return
     */
    static void insertSort(int[] source){
        for(int i=1; i < source.length; i++){

            if(source[i-1] > source[i]){
                int insertData = source[i];

                int j=i;

                while (j > 0 && source[j-1] > insertData) {
                    source[j]=source[j-1];
                    j--;
                }
                source[j]=insertData;
            }
        }
    }

3、希尔排序
希尔排序算法是插入排序的一种更高效的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。

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

  1. 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
  2. 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位

4、希尔排序算法思路

  1. 先取一个正整数 d1(d1 < n),把全部记录分成 d1 个组,所有距离为 d1 的倍数的记录看成一组,然后在各组内进行插入排序
  2. 然后取 d2(d2 < d1)
  3. 重复上述分组和排序操作;直到取 di = 1(i >= 1) 位置,即所有记录成为一个组,最后对这个组进行插入排序。一般选 d1 约为 n/2,d2 为 d1 /2, d3 为 d2/2 ,…, di = 1

5、希尔排序实例分析
假设有数组 array = [80, 93, 60, 12, 42, 30, 68, 85, 10],首先取 d1 = 4,将数组分为 4 组,如下图中相同颜色代表一组:

这里写图片描述

然后分别对 4 个小组进行插入排序,排序后的结果为:

这里写图片描述

然后,取 d2 = 2,将原数组分为 2 小组,如下图:

这里写图片描述

然后分别对 2 个小组进行插入排序,排序后的结果为:

这里写图片描述

最后,取 d3 = 1,进行插入排序后得到最终结果:

这里写图片描述

6、希尔排序Java实现

    /**
     * @Comment 希尔排序 
     * @Author Ron
     * @Date 2017年11月9日 上午11:53:37
     * @return
     */
    static void shellSort(int[] source){
        int group = source.length/2;

        while (group > 0) {
            for(int i=group; i<source.length; i++){
                if(source[i-group] > source[i]){
                    int insertData = source[i];

                    int j=i;

                    while (j > group-1 && source[j-group] > insertData) {
                        source[j]=source[j-group];
                        j-=group;
                    }

                    source[j]=insertData;
                }
            }
            group = group/2;
        }
    }
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RonTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值