def merge(lfrom, lto, low, mid, high):
i, j, k = low, mid, low
while i < mid and j < high:
if lfrom[i] < lfrom[j]:
lto[k] = lfrom[i]
i += 1
else:
lto[k] = lfrom[j]
j += 1
k += 1
while i < mid:
lto[k] = lfrom[i]
i += 1
k += 1
while j < high:
lto[k] = lfrom[j]
j += 1
k += 1
def merge_pass(lfrom, lto, llen, slen):
i = 0
while i+2*slen < llen:
merge(lfrom, lto, i, i+slen, i+2*slen)
i += 2*slen
if i + slen < llen:
merge(lfrom, lto, i, i+slen, llen)
else:
for j in range(i, llen):
lto[j] = lfrom[j]
def merge_sort(lst):
slen, llen = 1, len(lst)
templist = [None]*llen
while slen < llen:
merge_pass(lst, templist, llen, slen)
slen *= 2
merge_pass(templist, lst, llen, slen)
slen *= 2
归并排序的思想是:
- 跟快速排序从长序列排到短序列相反,归并排序是先排短的,再排长的。
- 对于一个序列,一开始视每一个元素为一个序列,两两合并。对于每一个“两两合并”,就是将两个排好序的序列合并的过程。
- 归并排序需要开辟和原序列一样大的空间。归并一遍的结果放到开辟的空间中。第二次的归并是从新空间归并到旧空间,如此反复就把序列排序了。
- 实现一共分为三个层级:
- 最低层级: 将两个已排序序列合并
- 中间层级:将整个序列,根据子序列长度,分别归并
- 最高层级:将子序列长度从1开始翻倍增加,直到子序列长度和序列长度一样,归并完成。