折半插入排序是在直接插入排序的基础上改进的,在直接插入排序算法中,总是边比较边移动元素,而折半插入排序则是将比较和和移动元素的操作分离出来:先折半查找出元素的待插入排序位置,然后统一的移动待插入位置之后的所有元素。
def binary_insert(alist):
for i in range(1, len(alist)):
index= alist[i]#将alist[i]暂存到index中
low = 0
high = i - 1 #设置折半查找的范围
while low <= high:
mid = (low + high) // 2 #取中间点
if idx > alist[mid]:#查找右半部分
low = mid + 1
else:
high = mid - 1#查找左半部分
# 跳出循环后 low==mid,high = low - 1
for j in range(i, low, -1):
alist[j] = alist[j - 1]#统一后移元素,空出插入位置
alist[low] =index#插入操作
return alist
if __name__ == '__main__':
a = [5,1,4,8,10,7,6,2,3,9]
print(binary_insert(a))
折半插入排序仅仅是减少了元素比较元素的次数,该比较次数与待排序列表的初始状态无关,仅取决于表中元素个数,而元素移动的次数没有变,它依赖于待排序列表的初始状态,因此折半插入排序的hi时间复杂度仍为O(n^2),它是一个稳定的排序算法。