java常用算法之插入排序---基本插入排序

算法实现:

public class Insert implements SuanFa {
    private static Logger logger = Logger.getLogger(Insert.class);

    @Override

    //数列分为排列好的前段和未排列的后段
    //把后段的数值一个个取出,放到前段的合适位置
    //这里需要注意往前段某一位置插入一个数,插入位置的后面数据整体下标位置加1(数组后移)
    public void suanFaRealise(int data[]) {
        logger.info("Insert realise start.");
        int dataSize = data.length;
        //这里注意data是从data[0]开始的就好理解了。
        for (int i = 1; i < dataSize; i++)
        {
            int j = i - 1;
            int current = data[i];
            logger.info("第" + i + "次排列, 排列前数组为: " + UtilTool.toString(data));
            logger.info("需要插入的值为" + data[i]);

            //此处要遍历已经排好的数列,需要把current往该数列哪里插入。
            for (; j >= 0 && data[j] > current; j--)
            {
                //比如当前你i=3,则j就为2,当发现data[2]>current时,需要把data[2]往后移动,即把data[3] = data[2];
                data[j + 1] = data[j];

                //此时再遍历data[1], 如果data[1]>current时,把data[2] = data[1],(把data[1],往后移动一位)
                //。。。。
            }

            //这里说明data[j] <= current, 把current放在j+1位置上,有人会怀疑j+1貌似就是current下标i,
            //其实不然,在上个for循环里j是一直减的,减到data[j] <= current满足时为止。
            data[j + 1] = current;

            logger.info("第" + i + "次排列后排列数组为:" + UtilTool.toString(data));

        }
    }
}

测试类:

public class Test {
    private static Logger logger = Logger.getLogger(Test.class);

    public static void main(String args[])
    {
        int[] test = {6, 1, 22, 7, 9, 33, 98, 55, 23, 78, 48};

        logger.info("suanfa test start.");
        //SuanFa suanfa = SuanFaFactory.getMaoPao();
        //SuanFa suanfa = SuanFaFactory.getKuaiSu();
        SuanFa suanfa = SuanFaFactory.getInsert();

        suanfa.suanFaRealise(test);
        logger.debug(UtilTool.toString(test));

    }
}

执行过程:

2020-04-13 13:59:58 [ main:0 ] - [ INFO ] suanfa test start.
2020-04-13 13:59:58 [ main:4 ] - [ INFO ] start Insert suanfa.
2020-04-13 13:59:58 [ main:5 ] - [ INFO ] Insert realise start.
2020-04-13 13:59:58 [ main:6 ] - [ INFO ] 第1次排列, 排列前数组为: [6, 1, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:6 ] - [ INFO ] 需要插入的值为1
2020-04-13 13:59:58 [ main:6 ] - [ INFO ] 第1次排列后排列数组为:[1, 6, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:8 ] - [ INFO ] 第2次排列, 排列前数组为: [1, 6, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:8 ] - [ INFO ] 需要插入的值为22
2020-04-13 13:59:58 [ main:8 ] - [ INFO ] 第2次排列后排列数组为:[1, 6, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 第3次排列, 排列前数组为: [1, 6, 22, 7, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 需要插入的值为7
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 第3次排列后排列数组为:[1, 6, 7, 22, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 第4次排列, 排列前数组为: [1, 6, 7, 22, 9, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:9 ] - [ INFO ] 需要插入的值为9
2020-04-13 13:59:58 [ main:10 ] - [ INFO ] 第4次排列后排列数组为:[1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:10 ] - [ INFO ] 第5次排列, 排列前数组为: [1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 需要插入的值为33
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 第5次排列后排列数组为:[1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 第6次排列, 排列前数组为: [1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 需要插入的值为98
2020-04-13 13:59:58 [ main:11 ] - [ INFO ] 第6次排列后排列数组为:[1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 第7次排列, 排列前数组为: [1, 6, 7, 9, 22, 33, 98, 55, 23, 78, 48]
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 需要插入的值为55
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 第7次排列后排列数组为:[1, 6, 7, 9, 22, 33, 55, 98, 23, 78, 48]
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 第8次排列, 排列前数组为: [1, 6, 7, 9, 22, 33, 55, 98, 23, 78, 48]
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 需要插入的值为23
2020-04-13 13:59:58 [ main:12 ] - [ INFO ] 第8次排列后排列数组为:[1, 6, 7, 9, 22, 23, 33, 55, 98, 78, 48]
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 第9次排列, 排列前数组为: [1, 6, 7, 9, 22, 23, 33, 55, 98, 78, 48]
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 需要插入的值为78
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 第9次排列后排列数组为:[1, 6, 7, 9, 22, 23, 33, 55, 78, 98, 48]
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 第10次排列, 排列前数组为: [1, 6, 7, 9, 22, 23, 33, 55, 78, 98, 48]
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 需要插入的值为48
2020-04-13 13:59:58 [ main:13 ] - [ INFO ] 第10次排列后排列数组为:[1, 6, 7, 9, 22, 23, 33, 48, 55, 78, 98]
2020-04-13 13:59:58 [ main:14 ] - [ DEBUG ] [1, 6, 7, 9, 22, 23, 33, 48, 55, 78, 98]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值