插入排序
插入排序
- 原理
- 第一步,保证\([0,0]\)区间元素有序,因为只有一个元素,所以不需要过多考虑
- 第二步,保证\([0,1]\)区间元素有序,如果第二个元素与前一个元素逆序,则交换位置
- 第三步,保证\([0,2]\)区间元素有序,如果第三个元素与前一个元素逆序,则交换位置,如果前面仍有元素,继续判断是否逆序直至没有元素或者呈顺序关系
- ...
代码实现
public class Solution {
public static void insertSort(int[] arr) {
int len = arr.length;
for (int i = 1; i < len; i++) {
int newNumIndex = i;
while (newNumIndex - 1 >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]) {
int temp = arr[newNumIndex];
arr[newNumIndex] = arr[newNumIndex - 1];
arr[newNumIndex - 1] = temp;
newNumIndex--;
}
}
}
}
-
总结
- 外层循环从索引\(1\)开始,因为第一步中的区间仅有一个元素不需要过多考虑
- 内层循环可以改写:
for (int j = 1; j <= i; j++) { if (arr[j - 1] > arr[j]) { int temp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = temp; } }
-
时间复杂度分析
根据插入排序关键循环,有
\[\sum\limits_{i=1}^{n-1}\sum\limits_{j=1}^{i}1=\sum\limits_{i=1}^{n-1}(i-1+1)=\frac{1}{2}n^2-\frac{1}{2}n \]因此,插入排序的时间复杂度为\(O(n^2)\)