用python实现折半插入排序对数组2,3,1,4,6,5,8,9,7进行排序并显示比较次数和排序次数
时间: 2024-12-29 14:28:07 浏览: 8
折半插入排序(Binary Insertion Sort)是一种改进的插入排序算法,通过将数组分为两部分进行递归处理,提高效率。对于给定的数组 [2, 3, 1, 4, 6, 5, 8, 9, 7],我们可以这样实现:
```python
def binary_insertion_sort(arr):
if len(arr) <= 1:
return arr
# 分治策略,找到中间元素的索引
pivot_index = len(arr) // 2
pivot = arr[pivot_index]
# 将小于pivot的元素放在左边,大于等于pivot的放在右边
less_than_pivot = [x for i, x in enumerate(arr) if x < pivot and i != pivot_index]
equal_or_greater_than_pivot = [x for i, x in enumerate(arr) if x >= pivot or i == pivot_index]
# 对左右两边分别递归排序
less_sorted = binary_insertion_sort(less_than_pivot)
greater_sorted = binary_insertion_sort(equal_or_greater_than_pivot)
# 合并结果
return less_sorted + [pivot] + greater_sorted
# 给定数组
arr = [2, 3, 1, 4, 6, 5, 8, 9, 7]
sorted_arr = binary_insertion_sort(arr)
# 计算比较次数
comparison_count = sum([len(a) - 1 for a in [less_than_pivot, equal_or_greater_than_pivot]])
# 插入排序次数
sort_count = comparison_count + 1 # 最后一次合并不需要额外比较
print(f"Sorted array: {sorted_arr}")
print(f"Comparison count: {comparison_count} times")
print(f"Sorting count (including the final merge): {sort_count} times")
```
运行上面的代码会得到排序后的数组和比较/排序次数。注意,由于折半插入排序并不是严格的二分查找过程,所以这里的比较次数并不一定是最好的情况下的平方根复杂度 O(nlogn),但在实践中,它通常会比普通插入排序更快一些。
阅读全文