(一) 算法描述
将n个元素的数列分为已有序和无序两个部分,每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
(二) 算法分析
- 最差时间复杂度:\(O(n^2)\)
- 最好时间复杂度:\(O(n)\)
- 平均时间复杂度:\(O(n^2)\)
- 空间复杂度: \(O(1)\)
- 稳定性: 稳定
(三) 算法伪码
1 | INSERTION-SORT(A) |
(四) 图解样例
下图每次迭代中,黑色的长方形保存取自A[j]的关键字,测试中将它与其左边的加阴影的c长方形中的值进行比较,加阴影的箭头指出数组值向右移动一个位置,黑色的箭头指出关键字被移到的地方,最终排好数组。
(五) 算法步骤
- 当前需要排序的元素(A[i]),跟已经排序好的最后一个元素比较(A[i-1]),如果满足条件继续执行后面的程序,否则循环到下一个要排序的元素;
- 缓存当前要排序的元素的值,以便找到正确的位置进行插入;
- 排序的元素跟已经排序号的元素比较,比它大的向后移动(升序);
- 要排序的元素,插入到正确的位置。
(六) java实现
1 | public class InsertSort{ |
(七) python实现
1 | class InsertSort(object): |
(八) 算法缺点与优化
1. 缺点
比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候。
2. 优化
直接插入排序每次往前插入时,是按顺序依次往前找,可在这里进行优化,以下为常见的两种优化算法:
折半插入排序算法
希尔排序算法
(九) 总结
插入排序是最简单的排序算法之一,当数据基本有序时,采用插入排序可以明显减少数据交换和数据移动次数,进而提升排序效率。
参考博客