• 经典排序之插入排序


    插入排序(Insertion Sort)的基本思想是:将一个待排序的无序数组分成两部分,通常情况下,将数组首个或者末尾元素视为一个有序数组,将其余部分视为一个无序数组。然后,遍历剩下的n-1个元素,并将其逐个与有序数组部分里的元素做比较,以升序排列为例,将无序数组部分里的元素插入到有序数组部分,并总是确保有序数组部分保持升序排列,直至无序数组中的元素遍历完为止。

    我接下来通过代码演示:

     1 import java.util.Arrays;
     2 /**
     3  * 插入排序
     4  */
     5 public class Test1 {
     6     static int k=0;
     7     static void insertSort(int[] arr){
     8         System.out.println("排序前:"+ Arrays.toString(arr));
     9         //将数组分为前后两部分,在将后半部分插入前半部分时,始终确保前半部分处于有序状态
    10         for(int i=1;i<arr.length;i++){
    11             if(arr[i-1]>arr[i]){
    12                 int temp=arr[i];
    13                 int j=i;
    14                 while(j>0 && arr[j-1]>temp){
    15                     arr[j]=arr[j-1];
    16                     j--;
    17                 }
    18                 arr[j]=temp;
    19             }else{
    20                 continue;
    21             }
    22             System.out.println("第"+(++k)+"次:"+Arrays.toString(arr));
    23         }
    24         System.out.println("排序后:"+ Arrays.toString(arr));
    25     }
    26     public static void main(String[] args) {
    27         int[] arr={15,23,8,4,6,9,19};
    28         insertSort(arr);
    29     }
    30 }

      上述代码运行结果如下:

    排序前:[15, 23, 8, 4, 6, 9, 19]
    第1次:[8, 15, 23, 4, 6, 9, 19]
    第2次:[4, 8, 15, 23, 6, 9, 19]
    第3次:[4, 6, 8, 15, 23, 9, 19]
    第4次:[4, 6, 8, 9, 15, 23, 19]
    第5次:[4, 6, 8, 9, 15, 19, 23]
    排序后:[4, 6, 8, 9, 15, 19, 23]
      最后,插入排序算法的时间复杂度为O(n²),是稳定的排序算法。
      此外还有一种写法:
    package com.itszt.test6;
    import java.util.Arrays;
    /**
     * 插入排序,数组分为两部分
     * 前一部分始终确保有序
     */
    public class Test4 {
        static int k=0;
        public static void main(String[] args) {
            int[] arr={15, 32, 14, 86, 54, 78, 36};
            System.out.println("排序前:"+ Arrays.toString(arr));
            insertSort(arr);
            System.out.println("排序后:"+ Arrays.toString(arr));
        }
        static void insertSort(int[] arr){
            //将待排序数组分为前后两部分,确保前半本部分始终有序
            for(int i=1;i<arr.length;i++){
                int temp=arr[i];
                int j=i;
                while(j>0 && arr[j-1]>temp){
                    arr[j]=arr[j-1];
                    j--;
                }
                arr[j]=temp;
                System.out.print("第"+(++k)+"次:");
                for(int m=0;m<=i;m++){
                    System.out.print(arr[m]+",");
                }
                System.out.println();
            }
        }
    }
    

      上述代码执行如下:

    排序前:[15, 32, 14, 86, 54, 78, 36]
    第1次排序:15,32,
    第2次排序:14,15,32,
    第3次排序:14,15,32,86,
    第4次排序:14,15,32,54,86,
    第5次排序:14,15,32,54,78,86,
    第6次排序:14,15,32,36,54,78,86,
    排序后:[14, 15, 32, 36, 54, 78, 86]  

    【备注:之所以稳定,是指当一个待排序数组中存在两个元素一样的情况时,如数组中有同为6的两个元素,通过插入排序,可以有效确保这两个数的相对前后位置。】

  • 相关阅读:
    jenkins+pytest+ allure运行多个py文件测试用例
    jenkins发送测试报告邮件
    appium+python 存在多个类时,不用每次都初始化解决办法
    allure报告定制(pytest+jenkins)
    UVa202
    UVa1588
    UVa1587
    OpenJ_Bailian3377
    OpenJ_Bailian 1852
    UVa227
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8053027.html
Copyright © 2020-2023  润新知