直接插入排序

一个小菜比的记录笔记,如有说错烦请指正

最近花了几天时间来学习数组排序,今天记录第二个排序算法,直接插入排序


思想如下:

个人理解:

把一个数组想象成一个有序一个无序数组,先将无序数组的第一个数值放入有序数组的第1位,下标位'0',拿出无序数组的 第'1'个元素 与 有序数组的第'0'个元素 进行比较,如果有序数组的 第'0’个元素比 无序数组的第 ‘1’个元素 大 则有序数组右移,将有序数组的第'0'位右移到第'1‘位,将无序数组的第'1'个元素插入有序数组的第'0'个元素

官方一点的解释:

把n个待排序的元素分为两组,一组是已排序(初始时只有1个元素),一组未排序(初始时包含n-1个元素)。排序过程中每次从未排序组中取出第一个元素,把它与已排序组的元素进行比较,插入到已排序组的适当位置,使之成为新的有序组。

可能这么解释很难理解,所以拿出一组数据进行排序

原始数组

9,3,5,2,1

第一次排序

3,9,5,2,1

第二次排序

3,5,9,2,1

第三次排序

2,3,5,9,1

第四次排序

1,2,3,5,9

下图借鉴老师图片:

代码如下

  int[] arr = randomArr();
        System.out.println("排序前:" + Arrays.toString(arr));
        //拿到第'1'位元素,因为已假设第0位在有序数组中,所以直接从第'1'位开始拿元素,与前一位进行比较
        for (int i = 1; i < arr.length; i++) {
            int temp = arr[i];
            //与前一下标对比 如果小于,进入循环,查找当前元素 第一个小于的 元素
            if (temp < arr[i - 1]) {
                //寻找 当前元素 第一个小于的元素
                for (int j = 0; j < i; j++) {
                    //如果找到 当前元素 第一个小于的元素
                    if(arr[j] > temp) {
                        /*
                            例如数组为
                            9,3,5,2,1
                            第 1次 发现 9 > 3
                            所以 数组应右移为 9 9 5 2 1
                            从j(第0位)右移到j+1位 右移 i(1) - j(0)
                            然后将 3 赋值给 第 0 位
                            赋值后 变为 3,9,5,2,1
                         */
                        System.arraycopy(arr,j,arr,j+1,i - j);
                        //此时 数组 已 右移成为 9 9 5 2 1 所以需要将arr[j]位变为 3
                        arr[j] = temp;
                        //终止循环
                        break;
                    }

                }

            }
        }
        System.out.println("排序后:" + Arrays.toString(arr));

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值