归并排序稳定性分析

归并排序稳不稳定关键要看 merge() 函数,也就是两个有序子数组合并成一个有序数组的那部分代码。在合并的过程中,如果 A[p…m]和 A[m+1…r]之间有值相同的元素,那我们可以像伪代码中那样,先把 A[p…q]中的元素放入 tmp 数组。这样就保证了值相同的元素,在合并前后的先后顺序不变。所以,归并排序是一个稳定的排序算法

def merge(lst1, lst2):  # 有序列表lst1 lst2 合并成lst3
    lst3 = []
    i1, i2 = 0, 0  # 追踪每个列表当前的位置
    n1, n2 = len(lst1), len(lst2)
    while i1 < n1 and i2 < n2:  # lst1 和lst2 都拥有更多元素
        if lst1[i1] < lst2[i2]:  # lst1 的第一个元素更小
            lst3.append(lst1[i1])  # 把这个小的追加到临时列表
            i1 = i1 + 1
        else:  # lst2 的第一个元素更小
            lst3.append(lst2[i2])
            i2 = i2 + 1
    if i1 == n1:
        for i in lst2[i2:]:
            lst3.append(i)
    else:
        for i in lst1[i1:]:
            lst3.append(i)
    return lst3


def mergeSort(nums):
    n = len(nums)
    if n <= 1:
        return nums
    m = n // 2
    left = mergeSort(nums[:m])
    right = mergeSort(nums[m:])
    return merge(left, right)


print(mergeSort([1, 3, 2, 4, 5, 7, 9,2]))

总结

  • 先操作左半部分,再操作右半部分,归并排序就是稳定的
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值