一、思想
把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序依次将有序元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
第1趟排序后的数组:
[101, 34, 119, 1]
第2趟排序后的数组:
[34, 101, 119, 1]
第3趟排序后的数组:
[34, 101, 119, 1]
第4趟排序后的数组:
[1, 34, 101, 119]
二、代码
public static void insertSort(int[] arr) {
//第1轮 {101, 34, 119, 1}-> {34,101, 119, 1}
for (int i = 0; i < arr.length; i++) {
//定义待插入的数
int insertVal = arr[i];
//即待插入的数的前面的数的下标
int insertIndex = i - 1;
//1.insertIndex >= 0 保证在给insertVal找插入位置,不越界
//2.insertVal < arr[insertIndex] 说明待插入的数,还没有找到插入的位置
//3.所以需要将arr[insertIndex]后移
while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex --;
}
//当退出while循环时,说明插入的位置找到,insertIndex + 1
if(insertIndex + 1 != i) {
arr[insertIndex + 1] = insertVal;
}
System.out.println("第"+ (i + 1) +"趟排序后的数组:");
System.out.println(Arrays.toString(arr));
}
}