归并排序比较次数(的坑)

例题:利用归并排序方法对数字序列:5,19,17,21,11,8,1进行排序,共需要进行( )次比较

答案:11

程序:

def merge_sort(arr):
    if len(arr)<=1:
        return arr
    mid = len(arr)//2      #坑仔这  分组出现问题
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left,right)
def merge(left,right):
    res = []
    while left and right:
        if left[0]<right[0]:
            res.append(left.pop(0))
        else:
            res.append(right.pop(0))
    res = res+left+right
    return res

以上程序分析该题:

第一次分解: 7//2=3   (5,19,17)  (21,11,8,1)
第二次分解: 3//2=1   (5) (19,17)   4//2 (21,11) (8,1)
第三次分解: 单个数字
第一次归并:(19,17)比较一次返回(17,19)  (21,11)比较一次返回(11,21) (8,1)比较一次返回(1,8)    共3次
第二次归并:(5,17)比较一次left为空 结束比较 返回(5,17,19)  (11,1)比较一次(11,8)比较一次 right为空   返回                                      (1,8,11,21)                                                                共3次
第三次归并:(5,1)比较一次,(5,8)比较一次,(17,8)比较一次,(17,11)比较一次,(17,21)比较一次,                                 (19,21)比较一次  left为空   返回(1,5,8,11,17,,19,21)  共6次  
总共 12次 

 更改程序:

def merge_sort(arr):
    if len(arr)<=1:
        return arr
    mid = (len(arr)+1)//2      #坑仔这  分组出现问题
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left,right)
def merge(left,right):
    res = []
    while left and right:
        if left[0]<right[0]:
            res.append(left.pop(0))
        else:
            res.append(right.pop(0))
    res = res+left+right
    return res

 

 分析:

第一次分解: (7+1)//2=4   (5,19,17,21)  (11,8,1)
第二次分解: (4+1)//2=2   (5,19) (17,21)   (3+1)//2 (11,8) (1)
第三次分解: 单个数字
第一次归并:(5,19)比较一次返回(5,19)  (17,21)比较一次返回(17,21) (11,8)比较一次返回(8,11)    共三次
第二次归并:(5,17)比较一次 (19,17)比较一次(19,21)比较一次 left为空   返回 (5,17,19,21)     (8,1)比较一次                                ringt为空  返回(1,8,11) 共4次
第三次归并:(5,1)比较一次,(5,8)比较一次,(17,8)比较一次,(17,11)比较一次  ringht为空                                                        返回(1,5,8,11,17,,19,21)  共4次  
总共 11次 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
归并排序是一种经典的排序算法,可以通过递归将数组分割成单个元素,然后再将这些单个元素按顺序合并,最终得到一个有序的数组。在实现归并排序的过程中,可以统计比较次数。 下面是一个使用Python实现归并排序并统计比较次数的例子: ```python def merge_sort(arr): if len(arr) <= 1: return arr, 0 mid = len(arr) // 2 left, left_count = merge_sort(arr[:mid]) right, right_count = merge_sort(arr[mid:]) merged, merge_count = merge(left, right) return merged, left_count + right_count + merge_count def merge(left, right): merged = [] count = 0 i = j = 0 while i < len(left) and j < len(right): if left[i] <= right[j]: merged.append(left[i]) i += 1 else: merged.append(right[j]) j += 1 count += len(left) - i merged.extend(left[i:]) merged.extend(right[j:]) return merged, count # 测试 arr = [5, 3, 8, 6, 2] sorted_arr, count = merge_sort(arr) print("排序后的数组:", sorted_arr) print("比较次数:", count) ``` 在上述代码中,`merge_sort` 函数用于进行归并排序,`merge` 函数用于合并两个有序数组,并统计比较次数。在每次合并过程中,当左边的元素大于右边的元素时,就会计算逆序对的个数,从而得到比较次数。 运行上述代码,输出结果为: ``` 排序后的数组: [2, 3, 5, 6, 8] 比较次数: 7 ``` 以上是一个简单的实现,你可以根据实际需求进行优化和修改。希望能对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值