zoukankan      html  css  js  c++  java
  • 排序算法——插入排序

    一、插入排序介绍

      1、介绍

        插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

      2、插入排序思想

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

      3、插入排序思路图

        

    二、插入排序实现

       使用插入排序对 101,34,119,1 这四个数进行从小到大的排序。

      1、推导过程

     1   //推导过程
     2     public static void insertSort(int[] arr) {
     3         
     4         //第一轮
     5         int insertVal = arr[1];       //定义待插入的数
     6         int insertIndex = 1 - 1;      //即 arr[1]的前面这个数的下标
     7         
     8         // 给 insertVal 找到插入的位置
     9         // 说明
    10         // 1.insertIndex >= 0 保证在给 insertVal 找插入位置,不越界
    11         // 2.insertVal < arr[insertIndex] 说明待插入的数,还没有插入位置
    12         // 3. 就需要将 arr[insertIndex] 后移,待插入的下标就要往前移,即insertIndex--
    13         while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
    14             arr[insertIndex + 1] = arr[insertIndex];
    15             insertIndex--;
    16         }
    17         //当退出 while 循环时,说明插入的位置找到 ,insertIndex + 1
    18         arr[insertIndex + 1] = insertVal;
    19         System.out.println("第一轮:" + Arrays.toString(arr));
    20         
    21         
    22         //第二轮
    23         insertVal = arr[2];
    24         insertIndex = 2 - 1;
    25         while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
    26             arr[insertIndex + 1] = arr[insertIndex];
    27             insertIndex--;
    28         }
    29         arr[insertIndex + 1] = insertVal;
    30         System.out.println("第二轮:" + Arrays.toString(arr));
    31         
    32         
    33         //第三轮
    34         insertVal = arr[3];
    35         insertIndex = 3 -1;
    36         while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
    37             arr[insertIndex + 1] = arr[insertIndex];
    38             insertIndex--;
    39         }
    40         arr[insertIndex + 1] = insertVal;
    41         System.out.println("第三轮:" + Arrays.toString(arr));
    42         
    43     }

      2、封装方法

     1 public static void insertSort(int[] arr) {
     2         
     3         int insertVal = 0;      //声明变量,初始化为0
     4         int insertIndex = 0;    //声明变量,初始化为0
     5         
     6         for (int i = 1; i < arr.length; i++) {
     7             insertVal = arr[i];    //定义待插入的数
     8             insertIndex = i - 1;   //即 arr[1]的前面这个数的下标
     9             
    10             // 给 insertVal 找到插入的位置
    11             // 说明
    12             // 1.insertIndex >= 0 保证在给 insertVal 找插入位置,不越界
    13             // 2.insertVal < arr[insertIndex] 说明待插入的数,还没有插入位置
    14             // 3. 就需要将 arr[insertIndex] 后移,待插入的下标就要往前移,即insertIndex--
    15             while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
    16                 arr[insertIndex + 1] = arr[insertIndex];
    17                 insertIndex--;
    18             }
    19             
    20             //如果待插入的位置就是本身的位置,就不需要执行这一步,否则把值插入到合适的位置
    21             if (insertIndex + 1 != i) {
    22                 arr[insertIndex + 1] = insertVal;
    23             }
    24             
    25             System.out.println("第" + i + "轮:" + Arrays.toString(arr));
    26         }
    27     }

      Tip:如果需要升序,将 while 中的 insertVal > arr[insertIndex] 即可。

      3、性能测试

     1 public static void main(String[] args) {
     2 
     3         //创建80000个随机的数组 
     4         int[] arr2 = new int[80000];
     5         for(int i = 0; i< 80000;i++) {
     6             arr2[i] = (int)(Math.random() * 80000);
     7         }
     8         
     9         Date date1 = new Date();
    10         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    11         String date1String = format.format(date1);
    12         System.out.println("排序前的时间是="+date1String);
    13         
    14         //测试插入排序
    15         insertSort(arr2);
    16         
    17         Date date2 = new Date();
    18         String date2String = format.format(date2);
    19         System.out.println("排序后的时间是="+date2String);
    20         
    21     }

       可以看出,使用插入法排序80000个数据大约需要2-3秒。

     

     

  • 相关阅读:
    Use HTTPS instead of HTTP
    Disable SSLv3
    JIRA Installation
    排序算法之简单选择排序
    排序算法之冒泡排序
    三本优秀的Python教程
    ubuntu*set*up
    程序员的十层楼(转载)
    drools spring config的问题
    MySQL Performance Tuning
  • 原文地址:https://www.cnblogs.com/niujifei/p/13257777.html
Copyright © 2011-2022 走看看