插入排序的基本方法是:每步将一个待排序的元素,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。插入排序主要有直接插入排序、二分插入排序、希尔排序,本章主要介绍二分插入排序。
算法思想
在直接插入排序的基础上改进,将顺序比较改进为二分比较,如序列为1,4,7,2,8,此时遍历至i=3,即待排元素为2,直接插入是从已排序列向前逐一比较,2和7比较,2和7交换;2和4比较,2和4交换;二分插入是和已排序列的中间元素元素比较,2和4比较,2和1比较,最终2应该放在索引为1的位置,即元素4所在位置,然后将元素4,7向右移动一位,将2插入索引为1的位置
代码实现
1 | public class BinaryInsertsort { |
复杂度
时间复杂度
二分插入排序的比较次数少于直接插入排序,但移动次数和直接插入排序相同,平均为O(n2)
空间复杂度
O(1),使用了一个额外空间存放temp值
稳定性
根据array[mid] == temp
执行left = mid + 1
可以看出插入位置为相等元素的右边,因此稳定
总结
排序算法 | 时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|
二分插入排序 | 平均为O(n2),优于直接插入排序 | O(1) | 稳定 |