【注】以下代码参考力扣<<排序算法全解析>>
插入排序:插入排序分为两种,本质上都是向数组中有序的小范围中插入一个元素使数组中有序的范围不断扩大。
法一:插入元素与有序范围内元素按顺序比较,满足交换条件则交换位置,否则找到插入元素位置并跳出本轮。
public static void insertSort(int[] arr) {
// 从第二个数开始,往前插入数字
for (int i = 1; i < arr.length; i++) {
// j 记录当前数字下标
int j = i;
// 当前数字比前一个数字小,则将当前数字与前一个数字交换
while (j >= 1 && arr[j] < arr[j - 1]) {
swap(arr, j, j - 1);
// 更新当前数字下标
j--;
}
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
法二:用一个变量保存插入元素值,将该值按顺序与有序范围内元素比较,满足交换条件则将对应的非插入元素移动,否则找到插入元素位置并跳出本轮。
public static void insertSort(int[] arr) {
// 从第二个数开始,往前插入数字
for (int i = 1; i < arr.length; i++) {
int currentNumber = arr[i];
int j = i - 1;
// 寻找插入位置的过程中,不断地将比 currentNumber 大的数字向后挪
while (j >= 0 && currentNumber < arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = currentNumber;
}
}
法二与法一的区别在于:法一每次比较只要满足条件就进行交换,法二利用变量先将插入值保存,通过比较不进行交换,而是移动已有序的元素将插入位置腾出来,最后再将值插入。
插入排序也是稳定的,其时间复杂度也是O(n^2)。