1. 程式人生 > >用python實現歸並排序

用python實現歸並排序

想是 一個 pass 列合並 cnblogs plist post 思想 str

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開始翻倍增加,直到子序列長度和序列長度一樣,歸並完成。

用python實現歸並排序