插入排序(思路分析+疑惑解析)

 

思路及疑惑后的思考解答

 

 

package sort;

import java.util.Arrays;
        /**
         * 插入排序(Insertion Sorting)的基本思想是:
         * 把n个待排序的元素看成为一个有序表和一个无序表
         * 开始时有序表中只包含一个元素,无序表中包含有n-1个元素
         * 排序过程中每次从无序表中取出第一个元素
         * 把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
         *
         * (1)其实这是同一个数组,只不过从第二个元素开始和第一个比较,接着该数组的下一个元素
         * 判断该数组的大小,并为其让位,找到合适的位置插入即可
         * (打牌时,拿牌,根据拿牌的花色和大小,边拿牌,边比较,边插入)
         * (2)insertIndex >= 0 保证在给insertVal 找插入位置,不越界
         *    insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
         * (3)问:1.插入的时候 arr[insertIndex + 1] = insertValue;???????????
         *    答:int insertIndex = i - 1;i是当前元素的位置,insertIndex - 1是当前元素的前一个位置;
         *    这个这里减一,在这里再加上一,即是当前元素的位置
         *    
         *    问:2.为什么要insertIndex - 1 在arr[insertIndex + 1] = insertValue;这里不就迷糊了?
         *    答while (insertIndex >= 0 &&arr[insertIndex] > insertValue)
         *    如果不 - 1的话,insertIndex还是当前的元素,即无法比较与insertValue大小关系
         *    
         *    不过可以修改,便于理解 修改之后容易造成数组越界,需要谨慎处理
         *     int insertIndex = i ;
         *     while (insertIndex >= 0 &&arr[insertIndex - 1] > insertValue)
         *      if(insertIndex  != i){
         *                 arr[insertIndex ] = insertValue;
         *             }
         *             
         *       最简便的方法就是修改定义: 将insertIndex改为preInsertIndex
        * */
public class InsertSort {
            public static void main(String[] args) {
                int[] arr = {101, 34, 119, 1, -1, 89};
                insertSort(arr);
                System.out.println(Arrays.toString(arr));
            }

            public static void insertSort(int[] arr) {

                for (int i = 1; i < arr.length; i++) {
                    //定义待插入的数
                    int insertValue = arr[i];
                    // 即arr[1]的前面这个数的下标
                    //从待插入元素的前一个位置开始找
                    int preInsertIndex = i - 1;//int insertIndex = i - 1;
                    // 给insertVal 找到插入的位置
                    // 说明
                    // 1. insertIndex >= 0 保证在给insertVal 找插入位置,不越界
                    // 2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
                    // 3. 就需要将 arr[insertIndex] 后移,给待插入的数腾位置
                    while (preInsertIndex >= 0 && arr[preInsertIndex] > insertValue) { //while (insertIndex >= 0 &&arr[insertIndex] > insertValue){
                        arr[preInsertIndex + 1] = arr[preInsertIndex];//比其小的后移位置,给其让地方
                        preInsertIndex--;
                    }
                    // 当退出while循环时,说明插入的位置找到
                    // int insertIndex = i - 1;i是当前元素的位置,insertIndex - 1是当前元素的前一个位置;
                    // 这个这里减一,在这里再加上一,即是当前元素的位置
                    if (preInsertIndex + 1 != i) {//{if (insertIndex != i)
                        arr[preInsertIndex + 1] = insertValue;//arr[insertIndex] = insertValue;
                    }
                }
                
    /*    
        每一步的演变过程
        int insertValue = arr[1];
        int insertIndex = 1 - 1;

        while (insertIndex >= 0 && arr[insertIndex] > insertValue){
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex --;
        }
        //找到插入的位置了
       arr[insertIndex + 1] = insertValue;

          insertValue = arr[2];
          insertIndex = 2 - 1;

        while (insertIndex >= 0 && arr[insertIndex] > insertValue){
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex --;
        }
        //找到插入的位置了
        arr[insertIndex + 1] = insertValue;


        insertValue = arr[3];
        insertIndex = 3 - 1;

        while (insertIndex >= 0 && arr[insertIndex] > insertValue){
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex --;
        }
        //找到插入的位置了
        arr[insertIndex + 1] = insertValue;

        insertValue = arr[4];
        insertIndex = 4 - 1;

        while (insertIndex >= 0 && arr[insertIndex] > insertValue){
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex --;
        }
        //找到插入的位置了
        arr[insertIndex + 1] = insertValue;


        insertValue = arr[5];
        insertIndex = 5 - 1;

        while (insertIndex >= 0 && arr[insertIndex] > insertValue){
            arr[insertIndex + 1] = arr[insertIndex];
            insertIndex --;
        }
        //找到插入的位置了
        arr[insertIndex + 1] = insertValue;*/
            }
        }


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值