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切换一下输入法,再切换回来就又行了。心累。