[英]Merge sort problem, the code is wrong in the recursion procedure
我正在研究合並排序,它是用遞歸過程編寫的,但這是不對的,我打印每個過程
import math
def merge_sort(A):
l=len(A)
if l>1:
merge_sort(A[:math.floor(l/2)])
merge_sort(A[math.floor(l/2):])
merge(A)
def merge(A):
l=len(A)
half1=A[:math.floor(l/2)]
half2=A[math.floor(l/2):]
l1=len(half1)
l2=len(half2)
B=[]
for i in range(l):
if l1 == 0:
B.append(half2[len(half2)-l2])
l2-=1
elif l2 == 0:
B.append(half1[len(half1)-l1])
l1-=1
elif half1[len(half1)-l1] <= half2[len(half2)-l2]:
B.append(half1[len(half1)-l1])
l1-=1
elif half2[len(half2)-l2] < half1[len(half1)-l1]:
B.append(half2[len(half2)-l2])
l2-=1
for i in range(l):
A[i]=B[i]
print(A)
A=[5,3,2,8,6,7,11,9,111,3]
merge_sort(A)
為了找出哪里錯了,我打印出每一步,這給了我
[3, 5]
[6, 8]
[2, 8, 6]
[2, 5, 3, 8, 6]
[7, 11]
[3, 111]
[9, 111, 3]
[7, 9, 11, 111, 3]
[5, 3, 2, 7, 8, 6, 11, 9, 111, 3]
切片提供了一個新數組,因此您的遞歸merge_sort
調用不會就地執行(即在輸入數組本身上)。 結果,沒有對輸入數組執行任何操作。
為了演示,請考慮以下代碼段:
a = [1, 2, 3]
b = a[:]
b[0] = 0
assert a[0] == b[0] # raise AssertionError
此外,還有更多錯誤:您需要在merge_sort
中返回新排序的子列表,然后將它們merge
在一起(接受兩個列表而不是只有一個參數)。 我建議逐行閱讀說明,然后重試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.