一、插入排序介绍

  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秒。

 

 

 

posted on 2020-07-06 21:51  格物致知_Tony  阅读(314)  评论(0编辑  收藏  举报