用python实现归并排序

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. 跟快速排序从长序列排到短序列相反,归并排序是先排短的,再排长的。
  2. 对于一个序列,一开始视每一个元素为一个序列,两两合并。对于每一个“两两合并”,就是将两个排好序的序列合并的过程。
  3. 归并排序需要开辟和原序列一样大的空间。归并一遍的结果放到开辟的空间中。第二次的归并是从新空间归并到旧空间,如此反复就把序列排序了。
  4. 实现一共分为三个层级:
  • 最低层级: 将两个已排序序列合并
  • 中间层级:将整个序列,根据子序列长度,分别归并
  • 最高层级:将子序列长度从1开始翻倍增加,直到子序列长度和序列长度一样,归并完成。
原文地址:https://www.cnblogs.com/theodoric008/p/8033095.html