【排序算法】史上最通俗易懂的【插入排序】详解

上套路,先来一通理论:

1、基本思想:

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

 

2、以【48,38,65,13,27】这组待排序的数组为例:

    我们通过上边的例子可以发现:

    n个元素的待排序数组,需要进行n-1次插入排序

 

3、分步代码实现:


        int[] arr = {48, 38, 65, 13, 27};

        //待插入的元素
        int insertValue;
        //待插入元素所在位置的前一个位置(因为要一次比较前边的元素)
        int index;


        //==============第一次插入===================
        //默认第一个数是已经处于有序表中了
        //所以将第二个数进行插入排序
        insertValue = arr[1];
        index = 1 - 1;

        //依次比较前边的每一个元素
        //此处必须index>=0在前边,否则的话会报数组越界
        while (index >= 0 && arr[index] > insertValue) {

            //如果前边的元素比待插入的元素大,就后移
            arr[index + 1] = arr[index];
            index--;

        }

        //当前边的某个元素不再比待插入的元素大,就将待插入的元素插入
        //而此时在经过上边while循环过后
        //此时index指向的是比待插入元素小的那个元素的位置,而待插入元素要插入在这个元素的后边
        //所以在index+1处插入
        arr[index + 1] = insertValue;

        System.out.println(Arrays.toString(arr));


        //===============第二轮==================
        //将第三个数进行插入
        insertValue = arr[2];
        index = 2 - 1;
        while (index >= 0 && arr[index] > insertValue) {

            arr[index + 1] = arr[index];
            index--;

        }

        arr[index + 1] = insertValue;

        System.out.println(Arrays.toString(arr));

        //==================第三轮================
        //插入第四个数
        insertValue = arr[3];
        index = 3 - 1;
        while (index >= 0 && arr[index] > insertValue) {

            arr[index + 1] = arr[index];
            index--;

        }

        arr[index + 1] = insertValue;

        System.out.println(Arrays.toString(arr));

        //====================第四轮========================
        //插入第五个数
        insertValue = arr[4];
        index = 4 - 1;
        while (index >= 0 && arr[index] > insertValue) {

            arr[index + 1] = arr[index];
            index--;

        }

        arr[index + 1] = insertValue;

        System.out.println(Arrays.toString(arr));

通过分步的实现,可以将每一步使用循环来实现,代码如下:

        
        //默认第一个元素已经是排好序的,所以从第二个元素开始
        for (int i = 1; i < arr.length; i++) {
            //要插入的值
            insertValue = arr[i];
            //从当前位置的前一个位置开始向前查找合适的位置
            index = i - 1;
            while (index >= 0 && arr[index] > insertValue) {

                //后移
                arr[index + 1] = arr[index];
                index--;

            }
            //★★★★★★★★★★★★★★★★★★★★★★★★★★★
            arr[index + 1] = insertValue;
            //★★★★★★★★★★★★★★★★★★★★★★★★★★★
        }

 

 

欧了,代码中注释部分解释的应该挺详细的了,我是小K,勇敢做自己,做最好的自己=。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值