将arr[n]数组看作两个数组,其中一个有序,一个无序。
开始时,有序数组只包含arr[0],无序数组为arr[1]-arr[n-1]。从无序数组中取出一个元素arr[1],在有序数组中寻找它合适的位置,然后进行插入,形成新的有序数组。
分步解析:
//逐步推导
//第一轮结果{3,17,25,14}
//定义待插入数
int insertVal = arr[1];
int insertIndex = 1 - 1;//arr[1]前面这个数的下标
//insertVal找到插入的位置
//1、保证insertVal插入位置不越界,
//2、insertVal < arr[insertIndex] 待插入的数还没有找到要插入的位置
//3、将arr[insertIndex] 向后移动
while(insertIndex>=0 && insertVal< arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//当退出while循环时,说明位置找到,index+1
arr[insertIndex + 1] = insertVal;
System.out.println("第1轮插入:"+ Arrays.toString(arr));
//第2轮
insertVal = arr[2];
insertIndex = 2 - 1;//arr[1]前面这个数的下标
while(insertIndex>=0 && insertVal< arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//当退出while循环时,说明位置找到,index+1
arr[insertIndex + 1] = insertVal;
System.out.println("第2轮插入:"+ Arrays.toString(arr));
//第3轮
insertVal = arr[3];
insertIndex = 3 - 1;//arr[1]前面这个数的下标
while(insertIndex>=0 && insertVal< arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//当退出while循环时,说明位置找到,index+1
arr[insertIndex + 1] = insertVal;
System.out.println("第3轮插入:"+ Arrays.toString(arr));
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[]{17,3,25,14,20,9};
for (int i = 1; i < arr.length ; i++) {
int insert = arr[i]; //定义要插入的数
int insertIndex = i-1; //要插入的目标位置初始化为插入数的前一位
while(insertIndex>=0 && arr[insertIndex]>insert){ //如果insert的前边的数>insert,则插入位置就一直向前寻找
arr[insertIndex+1] = arr[insertIndex]; //寻找的过程中,将比insert大的数,向后移一位
insertIndex--; //不断向前寻找
}
//循环出来的时候,表示已经找到了比insert小的数,即arr[insertIndex]
arr[insertIndex+1] = insert; //将insert插入到其后面
}
System.out.println(Arrays.toString(arr));
}
}