16、排序算法-插入排序

来源:https://www.bilibili.com/video/BV1B4411H76f?p=60

一、思路

插入排序:将原始数据分为一个有序表无序表,从无序表依次选择数据,插入到有序表的合适位置。

例如:[101,34,119,1],从小到大排列

开始:有序表:[101],无序表[34,119,1]

第一趟:选34与有序表比较。有序表:[34,101],无序表[119,1]

第二趟:选119与有序表比较。有序表:[34,101,119],无序表[1]

第三趟:选1与有序表比较。有序表:[1,34,101,119],无序表[]

关键在于怎么比较,这里说的是分成两个表,本质还是一个数组。

在第一趟,我们先取出要插入的数据34,与101比较,比较的结果是101应该放到原来34的位置(后移一位),前面没有数据了,不再继续比较,因为进行过位置移动,34要放到空出的位置。

在第二趟,我们同样先取出要插入的数据119,先跟101比较,不必交换,再与34比较,不必交换。前面没有数据了,不再继续比较,因为没进行过位置移动,199不动。

在第三趟,我们同样先取出要插入的数据1,先跟119比较,119需要放到1原来的位置(后移一位),再跟101比较,101要放到后一个位置,最后跟34比较,34要后移一位。前面没有数据了,不再继续比较,因为进行过位置移动,1要放到空出的位置。

二、实现

 1 public class InsertSort {
 2     public static void main(String[] args) {
 3         int[] arr = {101,34,119,1,23};
 4         System.out.println(Arrays.toString(arr));
 5 
 6         insertSort(arr);
 7         System.out.println(Arrays.toString(arr));
 8 
 9     }
10 
11     public static void insertSort(int[] arr){
12         for (int i = 1; i < arr.length; i++) {
13             int insertIndex = i - 1;
14             int insertVal = arr[i];
15             while (insertIndex >= 0 && insertVal < arr[insertIndex]){
16                 //数据顺序后移
17                 arr[insertIndex + 1] = arr[insertIndex];
18                 insertIndex--;
19             }
20             if(insertIndex + 1 != i){
21                 //位置发生过改变,要插入的数据放到空出的位置
22                 arr[insertIndex + 1] = insertVal;
23             }
24         }
25     }
26 }

结果

[101, 34, 119, 1, 23]
[1, 23, 34, 101, 119]

中间出了一点问题,idea没法输入中文注释了,解决方案:Ctrl+Shift切换一下输入法,再切换回来就又行了。心累。

 

原文地址:https://www.cnblogs.com/zhao-xin/p/13162239.html