插入排序和希尔排序-面试的希尔排序原来这么简单

插入排序:
实现步骤:
1 记录第二个数的值和下标
2 循环与前一个值比较
若小于则 将前一个值付给本位置,本位置下标减一
若大于 则值与下标都不变


    /**
     * 插入排序
     * 从第二个开始判断 大于前一个位置不变
     * 小于前一个 将前一个提前,直到找到不小于的位置这时候将插入的值放在此位置,
     * 由于之前的值都提前了一位,所以不存在值被覆盖而丢失
     * @param array
     * @return
     */

public int[] insertSort(int[] array){
        long a=System.currentTimeMillis();
        for (int i = 1; i < array.length; i++) {
            int index=i;            //  纪录自己的位置 大的时候不变化 小的时候减
            int tmp=array[i];       //记录自己的值

            for ( ; index>0 &&tmp<array[index-1]; index--) {
                array[index]=array[index-1];
                //执行完后index减1在判断
            }
            array[index]=tmp;
        }
        long b=System.currentTimeMillis();
        System.out.println("插入排序用时:"+(b-a)+"毫米");
        return array;
    }

希尔排序:

实现步骤:
1 设置gap序列即增量序列,最后一次gap必须是1
2 将相距gap的一组数按照插入排序(注意 插入排序从第二个开始)
3 插入排序 增量为gap 而不是1


    /**
     * 希尔排序是在插入排序基础上改善的排序
     * 插入排序思想 从第二个值开始 判断与前一个值的大小
     * @param array
     * @return
     */

    public int[] shellSort(int[]array){
        long a=System.currentTimeMillis();
        for(int gap=array.length/2;gap>0;gap=gap==2?1:(int)(gap/2.2)){      //算法书上说除以2.2效率最高
//          20个数 gap为 10 4 1
            for(int i=gap;i<array.length;i++){
                int index=i;
                int tmp=array[i];

                for(;index>=gap&&tmp<array[index-gap];index-=gap){
                    array[index]=array[index-gap];
                }
                array[index]=tmp;

            }
//          System.out.println(Arrays.toString(array));

        }
        long b=System.currentTimeMillis();
        System.out.println("插入排序用时:"+(b-a)+"毫米");

        return array;
    }

插入排序:由N-1趟排序组成,第i趟排序保证位置0到i-1上元素是已经排好序的。

在该算法代码实现中使用了可以减少元素交换次数的技巧:在for循环内,实现了数组元素移动而没有明显使用交换。将插入排序的搜索插入位置的过程和移动元素的过程合并一起进行,从而减少了元素交换次数。位置i上的元素存储在tmp中,而位置i之前的所有更大的元素都被向右移动一个位置;然后tmp被放置在正确的位置上。

该算法的平均时间为O(N^2)。希尔排序是为了冲破二次时间的屏障,但是最终证明,其时间最坏情况为O(N^2),

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值