1 回答

TA貢獻1802條經驗 獲得超5個贊
您的代碼中存在多個問題:
切片的初始化循環不正確。索引a應該分別從p和開始q+1。將它們更改為:
for i in range(n1):
L[i] = a[p+i]
for j in range(n2):
M[j] = a[q+1+j]
或者簡單地寫:
L = a[p..q+1]
M = b[q+1..r+1]
這使得qandr應該被排除在外而不是被包含在內是顯而易見的。
合并循環不正確:范圍應該是range(p, r+1)并且一旦一個臨時數組用完,比較指的是超出orL[i] <= M[j]邊界的元素。LM
q計算不正確merge_sort:它應該是q = (p + r) // 2
測試if len(a) <= 1:不正確,您應該測試切片是否至少有 2 個元素,如果沒有則什么也不做:
if p < r:
q = (p + r) // 2
merge_sort(a, p, q)
merge_sort(a, q + 1, r)
merge(a, p, q, r)
這是一個排除了上限的修改版本:
def merge(a, p, q, r):
L = a[p..q]
M = a[q..r]
i = 0
j = 0
for k in range(p, r):
if j >= len(M) or (i < len(L) and L[i] <= M[j]):
a[k] = L[i]
i += 1
else:
a[k] = M[j]
j += 1
def merge_sort(a, p, r):
if r - p > 1:
q = p + (r - p) // 2
merge_sort(a, p, q)
merge_sort(a, q, r)
merge(a, p, q, r)
a = [3,41,52,26,38,57,9,49]
merge_sort(a, 0, len(a))
for _ in range(len(a)):
print('%d', a[_])
添加回答
舉報