百度百科:
https://baike.baidu.com/item/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F/7214992?fr=aladdin
分析图
思路在代码里补充
代码:
package com.afmobi;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {0,-1,3,-5};
InsertSort.insertSort(arr);
}
public static void insertSort(int[] arr) {
// 原始数组 0,-1,3,-5,
//第1轮 结果 -1,0,3,-5,
//定义待插入的数
int insertVal = arr[1];
// 待插入数 的前有个数的下标
int insertIndex = 1 - 1;
// 给insertVal找到插入的位置
while (insertIndex >= 0 //不越界
&& insertVal < arr[insertIndex] ) { // 待插入的数还没找到位置 ,
arr[insertIndex + 1] = arr[insertIndex]; // 没找到位置就需要将 arr[insertIndex] 后移一位,
insertIndex-- ; // 继续比较前面一个数,直到找到插入位置
}
//找到插入位置 insertIndex + 1; 为什么不是insertIndex?大家可以通过debugger调试,主要在于上面循环时insertIndex--;跳出循环时insertIndex已经减去了1
arr[insertIndex + 1 ] = insertVal;
System.out.println("第一轮插入数组结果:" + Arrays.toString(arr));
// 第2轮 结果 -1,0,3,-5,
// 定义待插入的数
insertVal = arr[2];
// 待插入数 的前有个数的下标
insertIndex = 2 - 1;
// 给insertVal找到插入的位置
while (insertIndex >= 0 // 不越界
&& insertVal < arr[insertIndex]) { // 待插入的数还没找到位置 ,
arr[insertIndex + 1] = arr[insertIndex]; // 没找到位置就需要将
// arr[insertIndex]
// 后移一位,
insertIndex--; // 继续比较前面一个数,直到找到插入位置
}
// 找到插入位置 insertIndex + 1;
// 为什么不是insertIndex?大家可以通过debugger调试,主要在于上面循环时insertIndex--;跳出循环时insertIndex已经减去了1
arr[insertIndex + 1] = insertVal;
System.out.println("第二轮插入数组结果:" + Arrays.toString(arr));
// 第3轮 结果 -5,-1,0,3
// 定义待插入的数
insertVal = arr[3];
// 待插入数 的前有个数的下标
insertIndex = 3 - 1;
// 给insertVal找到插入的位置
while (insertIndex >= 0 // 不越界
&& insertVal < arr[insertIndex]) { // 待插入的数还没找到位置 ,
arr[insertIndex + 1] = arr[insertIndex]; // 没找到位置就需要将
// arr[insertIndex]
// 后移一位,
insertIndex--; // 继续比较前面一个数,直到找到插入位置
}
// 找到插入位置 insertIndex + 1;
// 为什么不是insertIndex?大家可以通过debugger调试,主要在于上面循环时insertIndex--;跳出循环时insertIndex已经减去了1
arr[insertIndex + 1] = insertVal;
System.out.println("第三轮插入数组结果:" + Arrays.toString(arr));
}
}
测试结果:
通过每轮的测试,我们可以看出规律,也是循环操作
代码
package com.afmobi;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = {0,-1,3,-5};
InsertSort.insertSort(arr);
}
public static void insertSort(int[] arr) {
int insertVal = 0;
int insertIndex = 0;
for (int i = 1; i < arr.length; i++) {
//待插入数
insertVal = arr[i];
// 待插入数 的前有个数的下标
int insertIndex = i - 1;
// 给insertVal找到插入的位置
while (insertIndex >= 0 //不越界
&& insertVal < arr[insertIndex] ) { // 待插入的数还没找到位置 ,
arr[insertIndex + 1] = arr[insertIndex]; // 没找到位置就需要将 arr[insertIndex] 后移一位,
insertIndex-- ; // 继续比较前面一个数,直到找到插入位置
}
//找到插入位置 insertIndex + 1; 为什么不是insertIndex?大家可以通过debugger调试,主要在于上面循环时insertIndex--;跳出循环时insertIndex已经减去了1
arr[insertIndex + 1 ] = insertVal;
System.out.printf("第%d轮插入数组结果:" ,i);
System.out.println(Arrays.toString(arr));
}
}
测试结果也是没问题的!