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)

你可能感兴趣的:(Python 数据结构与算法 —— 从分治的角度看快速排序、归并排序)