原理
保证区间内排好顺序,逐渐将区间外数据插入到该区间中。
从局部扩散到整体。
第一次:保证0-1范围内有序
arr[0]和arr[1]对比,若arr[0] 大于 arr[1] ,交换两个值,
0-1范围内有序。
第二次:保证 0-2 范围内有序。
arr[2]和arr[1]比,若 arr[1] 大于arr[2],交换两个值。
arr[1]和arr[0]再比,arr[0] 大于 arr[1] ,交换两个值。
至此,0-2范围内有序。
第三次:保证0-3范围内有序
arr[3]和arr[2]比,若 arr[2] 大于arr[3],交换两个值。
arr[2]和arr[1]比,若 arr[1] 大于arr[2],交换两个值。
arr[1]和arr[0]再比,arr[0] 大于 arr[1] ,交换两个值。
至此,0-2范围内有序。
第i次:保证0-i范围内有序
arr[i]和arr[i-1]比,若 arr[i-1] 大于arr[i],交换两个值。
图解
复杂度
时间复杂度 O(n²)
- 最好情况 O(n)
- 最差情况 O(n²)
额外空间复杂度 O(1)
代码实现
java
public static void insertSort(int[] array) {
if (array == null || array.length < 2) {
return;
}
for (int i = 1; i < array.length; i++) { // 控制第几次循环
for (int j = i; j > 0; j--) {
if (array[j] < array[j - 1]) {
swap(array, j, j -1);
}
}
}
}
kotlin
fun insertionSort(array: IntArray) {
if (array.size < 2) {
return
}
for (i in 1 until array.size) { // 0 ~ i 做到有序 抓扑克牌
for (j in i - 1 downTo 0) {
if (array[j] > array[j + 1]) {
swap(array, j, j + 1)
}
}
}
}