图解
代码推导:
package data_structure;
import java.util.Arrays;
public class insertSort {
public static void main(String[] args) {
int [] arr= {
5,1,17,11,9};
insert(arr);
}
public static void insert(int [] arr) {
//第一轮{5,1,17,11,9};
//{5,1,17,11,9}; => {5,5,17,11,9}; //1去那了 去insertVal里了
//定义待插入的数
int insertVal = arr[1]; //这是第一个数,因为第一个数默认是一个有序列表(下标为1,实际上他是第二个数)
int insertIndex = 1-1; //即arr[1]的前面这个数的下标(也可以看成是数组的第一个数字)
//给insertVal找到插入的位置
//说明
//1、insertIndex >= 0 保证在给insertVal 找插入位置,只要>=0才会不断的往前挤
//2、insertVal <= arr[insertIndex] 待插入的数据,还没有找到插入位置
//3、就需要将arr[insertIndex]后移
while(insertIndex >= 0 && insertVal <= arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;//从后往前移动
}
//当退出while循环时,说明插入的位置找到,insertIndex +1
arr[insertIndex+1]=insertVal;
System.out.println("第一轮插入");
System.out.println(Arrays.toString(arr));
insertVal = arr[1+1]; //这是第一个数,因为第一个数默认是一个有序列表(下标为1,实际上他是第二个数)
insertIndex = 1; //即arr[1]的前面这个数的下标(也可以看成是数组的第一个数字)
//给insertVal找到插入的位置
//说明
//1、insertIndex >= 0 保证在给insertVal 找插入位置,只要>=0才会不断的往前挤
//2、insertVal <= arr[insertIndex] 待插入的数据,还没有找到插入位置
//3、就需要将arr[insertIndex]后移
while(insertIndex >= 0 && insertVal <= arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;//从后往前移动
}
//当退出while循环时,说明插入的位置找到,insertIndex +1
arr[insertIndex+1]=insertVal;
System.out.println("第二轮插入");
System.out.println(Arrays.toString(arr));
insertVal = arr[1+1+1]; //这是第一个数,因为第一个数默认是一个有序列表(下标为1,实际上他是第二个数)
insertIndex = 2; //即arr[1]的前面这个数的下标(也可以看成是数组的第一个数字)
//给insertVal找到插入的位置
//说明
//1、insertIndex >= 0 保证在给insertVal 找插入位置,只要>=0才会不断的往前挤
//2、insertVal <= arr[insertIndex] 待插入的数据,还没有找到插入位置
//3、就需要将arr[insertIndex]后移
while(insertIndex >= 0 && insertVal <= arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;//从后往前移动
}
//当退出while循环时,说明插入的位置找到,insertIndex +1
arr[insertIndex+1]=insertVal;
System.out.println("第三轮插入");
System.out.println(Arrays.toString(arr));
insertVal = arr[1+1+1+1]; //这是第一个数,因为第一个数默认是一个有序列表(下标为1,实际上他是第二个数)
insertIndex = 3; //即arr[1]的前面这个数的下标(也可以看成是数组的第一个数字)
//给insertVal找到插入的位置
//说明
//1、insertIndex >= 0 保证在给insertVal 找插入位置,只要>=0才会不断的往前挤
//2、insertVal <= arr[insertIndex] 待插入的数据,还没有找到插入位置
//3、就需要将arr[insertIndex]后移
while(insertIndex >= 0 && insertVal <= arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;//从后往前移动
}
//当退出while循环时,说明插入的位置找到,insertIndex +1
arr[insertIndex+1]=insertVal;
System.out.println("第四轮插入");
System.out.println(Arrays.toString(arr));
}
}
代码整理:
import java.util.Arrays;
import day05.forTest;
public class insert {
public static void main(String[] args) {
int[] arr = {
5, 1, 17, 11, 9 };
insertsort(arr);
}
public static void insertsort(int[] arr) {
// 给insertVal找到插入的位置
// 说明
// 1、insertIndex >= 0 保证在给insertVal 找插入位置,只要>=0才会不断的往前挤
// 2、insertVal <= arr[insertIndex] 待插入的数据,还没有找到插入位置
// 3、就需要将arr[insertIndex]后移
for (int i =1 ; i < arr.length; i++) {
int insertVal = arr[i]; // 这是第一个数,因为第一个数默认是一个有序列表(下标为1,实际上他是第二个数)
int insertIndex = i - 1; // 即arr[1]的前面这个数的下标(也可以看成是数组的第一个数字)
while (insertIndex >= 0 && insertVal <= arr[insertIndex]) {
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;// 从后往前移动
}
// 当退出while循环时,说明插入的位置找到,insertIndex +1
arr[insertIndex + 1] = insertVal;
System.out.println("排序"+i+"次");
System.out.println(Arrays.toString(arr));
}
}
}