这里给出分治语义的一种通用性实现:
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)