zoukankan      html  css  js  c++  java
  • 小白懂算法之插入排序

    前言

      真的,看到挺多博客的插入排序,思路大多都是对的,但是在代码实现上不严谨,甚至还有的跟冒泡排序搞混了,还是有必要分析波插入排序,希望能帮助到大家。

    一.插入排序原理

        插入排序原理是:逐步构建有序的序列,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

    二.图解

    三.实现思路

      插入排序分为3种情况:

        1.当前节点<前面的A节点时,A节点后移一位,接着向前继续比较。
        2.当前节点>前面的A节点时,当前节点插入到A节点的后一个位置,此时不需要再继续比较了,因为A节点及之前的元素已经是有序的了
        3.当前节点<前面的A节点时,并且A节点的位置是0时,需要连续两步操作:A节点往后移一位,当前节点插入到数组下标为0的位置。

      如果这个思路看不懂没关系,请看代码,有更详细的解释。

    四.代码实现

      语言采用Java来实现,如果看不懂java代码关系也不大,基本每行都有解释

        /**
         *     实现思路:
         *         插入排序需要考虑3种情况:
         *             1.当前节点<前面的A节点时,A节点后移一位,接着继续比较
         *             2.当前节点>前面的A节点时,当前节点插入到A节点的后一个位置,此时不需要再继续比较了,因为A节点及之前的元素已经是有序的了
         *             3.当前节点<前面的A节点时,并且A节点的位置是0时,需要连续两步操作:A节点往后移一位,当前节点插入到数组下标为0的位置
         * 
         */
        public static int[] InsertionSortByFor(int[] arr) {
            
            /**
             *     最多遍历arr.length-1轮,i的值表示每轮从哪个位置开始向前比较;
             *     比如arr[1],那么arr[1]就和arr[0]进行比较
             *     arr[2],从arr[2]向前扫描比较
             *     arr[3],从arr[3]向前扫描比较
             *     依次类推
             */
            for(int i=1;i<arr.length;i++) {    
                int temp = arr[i];        //temp是保存着每轮当前节点的值,保存的目的是用于与前面的值做比较
                for(int j=i-1;j>=0;j--) {    //j的值记录的是当前节点的前面元素的下标位置;
                                            //只要满足j>=0,元素的比较才能进行,若j<0就会超出数组下标的范围
                                            //j--才能比较前面的元素
                    if(temp<=arr[j]) {    //当前节点<前面的A元素,那么A元素往后移
                        arr[j+1] = arr[j];
                        if(j==0) {    //这里属于特殊情况,当temp<=arr[j]以及j==0时,需要连续两步操作:1.A元素往后移 2.当前节点插入到arr[0]的位置
                            arr[j] = temp;
                        }
                    }else{    //当前节点>前面的A元素,那当前节点插入到A元素的后面,即j+1的位置
                        arr[j+1] = temp;
                        break;    //break是到这一步就不需要再往前比较了,因为A元素及之前的元素已经是有序了
                    }
                }
                
            }
            return arr;
        }

      main方法测试:

        public static void main(String[] args) {
            //创建一个无序数组
            int[] arr = new int[] {3,6,1,87,90,34,34,25};
            //调用插入排序方法,返回一个排序后的数组
            int[] sortedArr = InsertionSortByFor(arr);
            //遍历数组
            for(int i=0;i<sortedArr.length;i++) {
                System.out.print(sortedArr[i]+" ");
            }
        }

      测试结果:

      其实说得挺详细的了,基本都有注释,如果有不懂欢迎大家下面留言,上面的代码其实还有优化的空间,只不过临时写的,一些细节可能处理不到位请见谅

      可以的话给个推荐,让我知道你来过!

  • 相关阅读:
    打印机共享为什么老是出现“操作无法完成(错误 0X00000709)。再次检查打印机名称、并确保打印机连接网络
    给UITextField设置头或尾空白
    Objective-C中的关联(objc_setAssociatedObject,objc_getAssociatedObject,objc_removeAssociatedObjects)
    定时器在多线程中的使用
    block知识点
    UIViewController新方法的使用(transitionFromViewController:toViewController:duration:options:animations:completion:)
    NSMutableAttributedString 的使用方法,设置格式
    statusbar的颜色设置
    获取图片的缩略图
    彻底理解position与anchorPoint
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/13968333.html
Copyright © 2011-2022 走看看