1.算法介绍
折半插入排序(Binary Insertion Sort)是对直接插入排序算法的一种改进。 折半插入排序与直接插入排序算法原理相同。 只是,在向已排序的数据中插入数据时,采用来折半查找(二分查找)。 先取已经排序的序列的中间元素,与待插入的数据进行比较,如果中间元素的值大于待插入的数据,那么待插入的数据属于数组的前半部分,否则属于后半部分。
与直接插入算法相比,虽然折半插入改善了算法中比较次数的数量级大的问题,但是,仍旧没有改变移动元素的时间耗费,所以折半插入算法的时间复杂度还是O(n²),只是寻找插入位置的时候会节约更多时间。
2.代码实现
def BinaryInsertSort(mylist):
for i in range(1, len(mylist)):
"""将当前元素暂存起来"""
tmp = mylist[i]
"""在当前位置之前的范围查找插入"""
low = 0
high = i - 1
"""将范围折半再查找"""
while low <= high:
m = int((low + high) / 2)
"""tmp比范围中点大,范围后半段作为新的查找范围"""
if tmp > mylist[m]:
low = m + 1
else:
"""tmp比范围中点小,范围前半段作为新的查找范围"""
high = m - 1
"""此时mylist[high]的元素比tmp小"""
j = i - 1
"""mylist[high]之后的元素往后挪一位"""
while j >= high + 1:
mylist[j + 1] = mylist[j]
j -= 1
"""将tmp放在mylist[high]之后"""
mylist[high + 1] = tmp
if __name__ == "__main__":
mylist = [49, 38, 65, 87, 76, 13, 27, 49]
BinaryInsertSort(mylist)
print(mylist)
输出结果:
[13, 27, 38, 49, 49, 65, 76, 87]