插入排序,希尔排序笔记

  先了解插入排序,再说希尔排序,因为希尔排序是改进版的插入排序。
  那插入排序的思想是什么样的呢?插入排序的思想跟我们平常生活中的思想是一样的,假设你前面有三张牌,1,2,5,当然,都是有序的,那么,此时你手里也拿着一张牌,为3,那么怎么插入到前面的三张牌里呢?其实,我们的大脑不自觉的就会拿我们手里的3先跟5进行比较,3比5小,所以,3跟5要交换位置,然后3再跟2比,3比2大,那就不用交换,也不用再比下去了。这就是插入排序的思想。
  给个定义吧(按照我原话复述):先把数组的第1个数当成是已经排好序的区间,那剩下的就是从第2个数开始往后就是未排好序的区间,也就是数组此时被分成有序和无序两个区间,然后怎么做呢?就是先以无序区间里的第一个数跟有序区间的最后一个数相比,比它小,就交换位置,依次这样比下去,直到找到合适的位置,形成一个新的有序区间,那么与原来相比,有序区间就多了一个成员,无序区间就少了一个成员,后面的以此类推。
  以数组为5,2,3,1,9为例,按照以上说法,5会先被当做有序区间,剩下的2,3,1,9就被当做无序区间,然后再以无序区间为准,先从第一个数开始,也就是2,对有序区间的最后一个数依次向前比较,那么2跟5比,比5小,是不是就要交换位置呀,那就会变成2,5,3,1,9,再往前还有得比吗?没有了,没有的话第一轮结束,新的有序区间就是2,5,无序区间就是3,1,9,到第二轮,还是一样,先拿无序区间的第一个数3跟有序区间的最后一个数依次往前比较,直到找到合适的位置形成新的有序区间,以此类推,我就不再重复叙述了。
  接下来看代码,如下:

public static void main(String[] args) {
    int[] ins = {4,2,6,1,5,8};
    //先从索引为1的位置开始,每次循环,代表一轮结束
    for(int i=1; i<ins.length; i++){
        //从有序区间的最后一个数开始依次往前面比较,所以j要--
        for(int j=i; j>0; j--){
            //符合条件的要交换位置
            if(ins[j]<ins[j-1]){
                int temp = ins[j-1];
                ins[j-1] = ins[j];
                ins[j] = temp;
            }
        }
    }
    System.out.println(Arrays.toString(ins));
}

  以上就是插入排序的实现,接下来看希尔排序,前面我也说了,希尔排序是改进版的插入排序,那么希尔排序的思想是怎么样的呢?一句话,分步思想。什么意思?还是以数组为5,2,3,1,9为例,该数组的长度为5,那么我就让数组的长度除以2,得到2,那么也就是说,步数为2,可以拿插入排序来理解,像插入排序步数就为1,也就是要跟我前一个数进行依次比较,那2是不是就要跟我前第二个数进行依次比较呀!如下图:
在这里插入图片描述  代码如下:

public static void main(String[] args) {
    int[] ins = {5,2,3,1,9};
    for(int step=ins.length/2;step>0;step/=2){
        for(int i=step; i<ins.length; i++){
            for(int j=i; j>=step; j-=step){
                if(ins[j]<ins[j-step]){
                    int temp = ins[j-step];
                    ins[j-step] = ins[j];
                    ins[j] = temp;
                }
            }
        }
    }
    System.out.println(Arrays.toString(ins));
}

  以上代码就是我由插入排序改造而来的希尔排序,细品,debug一下就知道了,我也不好每个代码都做个解释,但可以画个图,如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值