Insertion Sort - HolmesJJ/Data-Structures-and-Algorithms GitHub Wiki
入门链接
5分钟搞定插入排序法 演算法 -- 六種排序法之二:插入排序法(insertion sort)
图解
详解
插入排序--直接插入排序 插入排序(图解) 插入排序及时间复杂度分析
标准写法
步骤1: 两层循环
- 外层循环:需要比较的轮数,从第二个数开始,把N个数进行N-1轮排序,当前轮的元素记作n
- 内层循环:在当前轮中,遍历该轮元素n前的每一个元素并比较
public static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
for (int j = i; j >= 0; j--) {
}
}
}
步骤2: 移动元素并交换
public static void insertionSort(int[] arr) {
int temp = 0;
for (int i = 1; i < arr.length; i++) {
// 记录当前轮的元素
temp = arr[i];
for (int j = i; j >= 0; j--) {
if (j > 0 && arr[j - 1] > temp) {
// 把元素往后移动一个位置
arr[j] = arr[j - 1];
} else {
// 移动结束后,或到第一个元素后,前面记录的值覆盖到移动结束后的位置
arr[j] = temp;
break;
}
}
}
}
要点
- 把N个数进行N-1轮排序,注意是"轮"
- 既可以升序排序,也可以降序排序,把if中的交换两个数的条件
arr[j - 1] > temp
改为arr[j - 1] < temp
即可 - 最好时间复杂度是O(n):已排好序;平均时间复杂度是O(n^2);最坏时间复杂度是O(n^2):倒序
- 空间复杂度O(1)