6.3-直接插入排序

package com.hejiale.arithmetic.sort.bubble;

import java.util.Arrays;

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21,-21};
        /*
            直接插入排序思路:
                直接插入排序的核心
                    1.  就是将数组分为了两部分,有序部分和无序部分,然后我们每次从无序部分中,选择一个
                        元素
                    2.  紧接着遍历有序部分,找到合适的插入位置
                    3.  将插入位置以及之后的元素全部后移,空出一个位置用来放待插入元素,
                        或者另一种思路,我们遍历的过程中,没遍历一次,如果没有找到待插入位置,就将该元素后移
            代码实现:
                1.  首先,准备两个辅助变量
                    1.  insertIndex 用来保存假定插入位置
                    2.  insertVal 用来保存待插入元素,因为在之后的遍历过程中,回发生元素的移动,可能回将arr[i]覆盖
                        所以我们提前用insertVal保存待插入元素
                    3.  for循环,该循环每次操作的对象就是待插入元素
                        之后,倒着遍历有序部分,没遍历一次,如果没有获得最终插入位置,就后移一次,直到找到最终插入位置为止

        */
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }


    public static void insertSort(int[] arr){
        int insertIndex = 0;
        int insertVal = 0;
        //我们将数组分为有序部分和无序部分,有序部分初始值长度为1,所以我们应该从下标为1的元素开始遍历
        for (int i = 1; i < arr.length; i++) {
            /*
                注意,我们这里并没有设置insertIndex为0,而是i-1,因为我们是倒着遍历有序部分
           */
            insertIndex = i - 1;
            /*
                待插入元素位arr[i],因为在后面的移动元素的过程中,arr[i]很有可能被覆盖,所以要提前保存好inserVal的值
            */
            insertVal = arr[i];
            /*
                1.  insertIndex >= 0 防止发生越界异常
                2.  arr[insertIndex] > insertVal 是用来定位插入位置,因为有序部分由小到大,所以如果假定插入位的元素
                    大于待插入元素,就说明还没有找到插入位置,所以应该将待插入位置的元素后移一位,然后insertIndex递减
                直到
                    1.  insertIndex <0 说明待插入元素是最小值,应该将待插入元素放到数组的第一个,也就是有序部分的
                    全部元素都要后移
                    2.  arr[insertIndex] <= insertVal 说明insertIndex就是最终的插入位置
            */
            while (insertIndex >= 0 && arr[insertIndex] > insertVal){
                arr[insertIndex+1] = arr[insertIndex];
                insertIndex--;
            }
            /*
                while循环遍历完,就可以找到插入位置:insertIndex+1,接下来赋值即可
            */
            arr[insertIndex + 1] = insertVal;
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值