插入排序(Insertion-Sort)
插入排序
插入排序(Insertion-Sort) 的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
算符描述
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
算法分析
时间复杂度(平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|
\(O(n^2)\) | \(O(n^2)\) | \(O(n)\) | \(O(1)\) | 稳定 |
例子
![](https://img2022.cnblogs.com/blog/2758160/202202/2758160-20220223083353099-1777533429.png)
动图演示
![](https://images.cnblogs.com/cnblogs_com/blogs/734424/galleries/2112342/o_220221105521_%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F.gif)
代码
Java
public static void insertSort(int[] array) {
for (int i = 1; i < array.length; i++) {
int insertValue = array[i];
int j = i - 1;
//从右向左比较元素的同时,进行元素复制
for (; (j >= 0) && (insertValue < array[j]); j--) {
array[j + 1] = array[j];
}
//insertValue的值插入适当位置
array[j + 1] = insertValue;
}
}
python
func insertionSort(arr []int) []int {
for i := range arr {
preIndex := i - 1
current := arr[i]
for preIndex >= 0 && arr[preIndex] > current {
arr[preIndex+1] = arr[preIndex]
preIndex -= 1
}
arr[preIndex+1] = current
}
return arr
}