1、算法介绍
- 对前面的两个数据进行排序。
- 将第三个数据与前面的数据进行比较,然后将第三个数据插入到合适位置(如果第三个数据大于第二个数据则不进行操作,如果小于第二个数据,则将第二个数据进行后移(与第三个数据交换位置,第三个位置数据已经拷贝)一位)
- 第四个数据则与前面的三个数据进行比较,然后插入到合适位置。
- 重复以上步骤(循环 n - 1 次)
2、举例演示
原数组: [117, 101, 106, 155, 112]
第一次循环前数组:[117, 101, 106, 155, 112]
将前面两个数据进行排序,117 与 101进行交换位置。
先将101用一个临时变量进行拷贝,然后将117数据替换101,替换后数据为:[117, 117, 106, 155, 112]
然后将拷贝的101替换一号位置。
第一次循环后数组:[101, 117, 106, 155, 112]
第二次循环前数组:[101, 117, 106, 155, 112]
先拷贝106
然后将106与前面一个数据(117)进行比较,106 小于 117
将117数据替换106位置,替换后数据:[101, 117, 117, 155, 112]
然后将106与101比较,106 大于 101,直接将106替换117之前的位置(101后一个位置)。
第二次循环后数组:[101, 106, 117, 155, 112]
第三次循环前数组:[101, 106, 117, 155, 112]
先拷贝155
然后将155与前面一个数据(117)进行比较,155 大于 117
115替换自己的位置(换了个寂寞),循环结束。
第三次循环后数组:[101, 106, 117, 155, 112]
第四次循环前数组:[101, 106, 117, 155, 112]
先拷贝112
然后将112与前面一个数据(155)进行比较,112 小于 155
将数据115替换(后移一位)112位置,替换后数据:[101, 106, 117, 155, 155]
再将112与前面第二个数据(117)进行比较,112 小于117
将数据117后移一位,后移后的数据:[101, 106, 117, 117, 155]
再将112与前面第三个数据(106)进行比较,112 大于 106。
将112替换106后面一个位置的数据。
第四次循环后数组:[101, 106, 112, 117, 155]
3、图解
4、代码实现
package sort;
import java.util.Arrays;
/**
* <p>
*
* </p>
*
* @author: D
* @since: 2020/9/8
* @version: 1
*/
public class InsertionSortDemo {
public static void main(String[] args) {
int[] arr = {117, 101, 106, 155, 112};
insertionSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));
}
private static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
System.out.println("当前备份的数据:" + temp);
// 保存当前拷贝的数据的前一个下标
int preIndex = i - 1;
// preIndex 小于 0 或者 temp大于前面的数据则不进入移动的循环
while (preIndex >= 0 && temp < arr[preIndex]) {
// 拷贝的数据小于比较的数据,将比较的数据后移一位/
arr[preIndex+1] = arr[preIndex];
System.out.println(temp + "小于" + arr[preIndex] + "," + arr[preIndex] + "后移一位");
// 下标前移一位
preIndex--;
System.out.println("后移后:" + Arrays.toString(arr));
}
System.out.println("选中数据" + temp + "插入" + (preIndex + 1) + "位置");
arr[preIndex + 1] = temp;
System.out.println("插入后:" + Arrays.toString(arr));
System.out.println();
}
}
}