Python 数据结构与算法 —— 从分治的角度看快速排序、归并排序

这里给出分治语义的一种通用性实现:

def divide_and_conquer(S, divide, combine):
    if len(S) <= 1: return S
    L, R = divide(S)
    A = divide_and_conquer(L, divide, combine)
    B = divide_and_conquer(R, divide, combine)
    return combine(A, B)

所以分治的实施,关键问题在于 divide(分) 方法和 combine (合)方法;

对于归并排序,

  • (1)divide:按长度进行二分
  • (2)combine:也即是 merge(L, R),对两个有序数列进行归并;

所以,我们都知道归并排序(mergesort(S))的实现,需要借助 merge(L, R) 这一辅助函数(对两个已排序数列进行合并),merge 函数执行的是合(combine)的动作;快速排序(quicksort)的实现,则需要借助 partition 这一辅助函数,partition 执行的是分(divide)的动作。

归并排序

def merge(L, R):
    l1, l2 = len(L), len(R)
    S = []
    i, j = 0, 0
    while i < l1 and j < l2:
        if L[i] < R[j]:
            S.append(L[i])
            i += 1
        else:
            S.append(R[j])
            j += 1
    if i < l1:  S += L[i:]
    if j < l2:  S += R[j:]
    return S

def mergesort(seq):
    if len(seq) <= 1: return seq
    m = len(seq)//2
    L, R = seq[:m], seq[m:]
    L, R = mergesort(L), mergesort(R)
    return merge(L, R)

快速排序

def partition(seq):
    pivot, seq = seq[0], seq[1:]
    low = [x for x in seq if x <= pivot]
    high = [x for x in seq if x not in low]
    return low, pivot, high

def qsort(seq):
    if len(seq) <= 1: return seq
    low, pivot, high = partition(seq)
    return qsort(low)+[pivot]+qsort(high)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值