活动地址:优快云21天学习挑战赛
1.折半插入排序(Binary Insertion Sort)
1.1 概念:
是对插入排序算法的一种改进。所谓插入排序,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。
1.2 具体操作:
在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high]。将待插入元素与a[mid](其中mid=low+(high-low)/2)相比较,如果比参考元素小,则选择a[low]到a[mid-1]为新的插入区域(即high=mid-1),否则选择a[mid+1]到a[high]为新的插入区域(即low=mid+1),如此直至low<=high不成立,即将high+1位置及之后所有元素后移一位,并将新元素插入a[high+1]。寻找插入点的二分查找算法见下图:

2.图示
使用折半插入排序算法将数组 { 4,2,8,0,5,7,1,3,6,9 } 进行升序排序。

3.代码实现(python):
import copy
# 折半插入排序
def binary_insert_sort(lst):
for i in range(1, len(lst)):
if i == 1:
order_area = lst[:i]
else:
order_area = ordered
pos = get_pos(order_area , lst[i])
print(pos)
order_area.insert(pos, lst[i])
ordered = copy.deepcopy(order_area)
print("插入后的有序列表为:" + str(ordered))
def get_pos(ordered, target):
low = 0
high = len(ordered) - 1
while low < high:
mid = (low + high) // 2
if target < ordered[mid]:
high = mid - 1
elif target > ordered[mid]:
low = mid + 1
else:
return mid
else:
mid = (low + high) // 2
if target > ordered[mid]:
return mid + 1
else:
if mid == 0:
return 0
else:
return mid
lst = [4, 2, 8, 0, 5, 7, 1, 3, 6, 9]
binary_insert_sort(lst)
注意:列表中的元素必须保持有序,否则不符合二分查找的要求。
4.算法性能
4.1 时间复杂度:
折半插入排序算法比直接插入排序算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为 O ( n 2 ) \ O(n^2) O(n2),与直接插入排序算法相同。
4.2 稳定性:
由于在比较的时候,对于两个相等的元素,不会进行移动,排序完成后,相同元素之间的先后顺序不变,所以折半插入排序算法是一种稳定的排序算法,如下图所示。

本文详细介绍了折半插入排序的概念、具体操作流程,并通过图示和Python代码实现了对数组{4,2,8,0,5,7,1,3,6,9}
1538

被折叠的 条评论
为什么被折叠?



