def halfinsertsort(source):
for i in range(1, len(source)):
chosen = source[i]
low = 0
high = i - 1
while low <= high:
mid = int((low + high) / 2)
if source[mid] <= chosen:
low = mid + 1
else:
high = mid - 1
dest = high + 1
source[dest:i + 1] = [chosen] + source[dest:i]
return source
print(halfinsertsort([2, 1, 4, 5, 3]))
折半插入排序,使用折半查找的方式去给待插入数据对象找到一个位置进行插入,相比与后插法减少了比较次数,数据移动次数并没有减少,所以效率较常规的插入排序时间复杂度差不多。算法中唯一的难点在于最后取high + 1为待插入数据插入的位置。这可以通过归纳总结出来,折半查找的过程其实就是在不断缩小待插入数据应该被插入的范围,这个范围记为[low, high],当这个范围缩小到1的时候,也就是low等于high,再缩小就没法缩小了,这个时候mid等于low和high,待插入的数据,当它比source[mid]小,那么待插入数据应该插在mid的位置,mid及后面的数据应该后移,根据逻辑执行了high = mid - 1之后跳出循环,所以跳出循环之后待插入数据应该插在mid位置也就是high + 1位置。待插入数据如果它不比source[mid]小,那么应该插在mid后面,也就是mid + 1位置,根据逻辑执行了low = mid + 1之后跳出循环,high这个时候没变等于mid,因此跳出循环之后待插入数据应该插在high + 1位置。