排序算法之插入排序

基本介绍

插入排序是对一对序列以插入的方式寻找该元素的适当位置,以达到排序的目的。

基本思想

把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次和有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

案例分析

初始数据: [ 3, 1, -1, 2, 4]

  1. 将数组开始分为 {3} ,{1,-1,2,4},然后将1和3进行比较,3比1大,则将1插入3前面,一轮插入排序后,数组变成{1,3},{-1,2,4}
  2. 此轮插入的数为-1,首先将-1和3进行比较,-1比3小,继续比较1和-1,-1比1小,一轮插入排序后,数组变成{-1,1,3},{2,4}
  3. 此轮插入的数为2,首先将2和3进行比较,2比3小,继续比较,发现2比1大,结束此轮遍历,数组变成{-1,1,2,3},{4}
  4. 此轮插入的数为4,首先比较3和4,4比3大,遍历结束,插入排序结束,数组变成{-1,1,2,3,4}

代码分步实现

       int[] arr = new int[]{3, 1, -1, 2, 4};

        //开始将数组分为有序和无序列表 {3} {1,-1,2,4};待插入的数据为 1
        int insertVal = arr[1];
        int j = 0;
        //从右到左倒叙遍历有序列表,进行比较,如果插入值比倒叙遍历中的值大,
        // 则跳出遍历,并将待插入的值插入当前下标的位置
        // 如遍历到待插入的值比有序列表中的值小,则将当前下标的值后移
        for (j = 0; j >= 0; j--) {
            if (insertVal < arr[j]) {
                arr[j + 1] = arr[j];
            } else {
                break;
            }
        }
        //此处为j+1 是此轮循环后,j进行了j--操作
        arr[j+1] = insertVal;

        System.out.println("第一次插入排序后:" + Arrays.toString(arr));

        insertVal = arr[2];
        for (j = 1; j >= 0; j--) {
            if (insertVal < arr[j]) {
                arr[j + 1] = arr[j];
            } else {
                break;
            }
        }
        arr[j+1] = insertVal;
        System.out.println("第二次插入排序后:" + Arrays.toString(arr));

        insertVal = arr[3];
        for (j = 2; j >= 0; j--) {
            if (insertVal < arr[j]) {
                arr[j + 1] = arr[j];
            } else {
                break;
            }
        }
        arr[j+1] = insertVal;
        System.out.println("第三次插入排序后:" + Arrays.toString(arr));

        insertVal = arr[4];
        for (j = 3; j >= 0; j--) {
            if (insertVal < arr[j]) {
                arr[j + 1] = arr[j];
            } else {
                break;
            }
        }
        arr[j+1] = insertVal;
        System.out.println("第四次插入排序后:" + Arrays.toString(arr));

运行结果:

第一次插入排序后:[1, 3, -1, 2, 4]
第二次插入排序后:[-1, 1, 3, 2, 4]
第三次插入排序后:[-1, 1, 2, 3, 4]
第四次插入排序后:[-1, 1, 2, 3, 4]

排序代码实现

将发步骤的代码整合中两层循环,代码如下:

  for (int i = 1,j; i < arr.length; i++) {
            int insertVal = arr[i];
            for (j = i - 1; j >= 0; j--) {
                if (insertVal < arr[j]) {
                    arr[j + 1] = arr[j];
                } else {
                    break;
                }
            }
            arr[j + 1] = insertVal;
            System.out.println("第"+i+"轮插入排序后:"+Arrays.toString(arr));
        }

运行结果:

1轮插入排序后:[1, 3, -1, 2, 4]2轮插入排序后:[-1, 1, 3, 2, 4]3轮插入排序后:[-1, 1, 2, 3, 4]4轮插入排序后:[-1, 1, 2, 3, 4]

上述代码在内层循环中结合我们都会执行这条语句:

arr[j + 1] = insertVal;

当我们在没有数据进行交换的时候,是可以不需要进行赋值操作的;代码改动如下:

  for (int i = 1,j; i < arr.length; i++) {
            int insertVal = arr[i];
            for (j = i - 1; j >= 0; j--) {
                if (insertVal < arr[j]) {
                    arr[j + 1] = arr[j];
                } else {
                    break;
                }
            }
            if (j+1 != i){
                arr[j + 1] = insertVal;
            }
            System.out.println("第"+i+"轮插入排序后:"+Arrays.toString(arr));
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值