用python實現歸並排序
阿新 • • 發佈:2017-12-13
想是 一個 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開始翻倍增加,直到子序列長度和序列長度一樣,歸並完成。
用python實現歸並排序