[英]having trouble with merge sort
我覺得我的算法很好,但不知道為什么我不能得到正確的 output。 我認為它與遞歸有關,但我在調試時遇到了麻煩。
def merge(front, back):
i = 0
j = 0
k = 0
while i < len(front) and j < len(back):
if front[i] < back[j]:
x[k] = front[i]
i = i+1
else:
x[k] = back[j]
j = j+1
k = k+1
while(i < len(front)):
x[k] = front[i]
i = i +1
k = k+1
while(j < len(back)):
x[k] = back[j]
j = j +1
k = k+1
return x
def mergeSort(x):
if len(x) > 1:
front = x[:len(x)//2]
back = x[len(x)//2:]
mergeSort(front)
mergeSort(back)
merge(front,back)
x = [12,11,13,5,6,7]
mergeSort(x)
print(x)
output:[5、12、11、13、6、7]
導致您悲傷的主要問題是merge
function 中的變量x
。
請注意,當您調用merge
時,您正在對x
進行更改。 x
沒有在本地命名空間中定義,也沒有在封閉的命名空間中定義。 所以它一直在尋找,直到它到達全局命名空間。 全局命名空間中定義的x
是[12,11,13,5,6,7]
因此它正在對此x
進行更改。
為了解決這個問題,只需將來自mergeSort
的x
輸入到merge
中。 由於mergeSort
function 的遞歸性質,可能會發生此行為。
您可以在此處了解有關名稱空間和變量范圍的更多信息。
嵌套的 while 循環也存在問題。 在第一個 while 循環完成之前,您不想執行第二個和第三個 while 循環。 第一個while循環的停止條件是前或后已經完全排序。
def merge(front, back, x):
i = 0
j = 0
k = 0
while i < len(front) and j < len(back):
if front[i] < back[j]:
x[k] = front[i]
i = i+1
else:
x[k] = back[j]
j = j+1
k = k+1
#These two while loops have been moved back one indentation
#to run after the first while loop stops
while(i < len(front)):
x[k] = front[i]
i = i +1
k = k+1
while(j < len(back)):
x[k] = back[j]
j = j +1
k = k+1
return x
def mergeSort(x):
if len(x) > 1:
front = x[:len(x)//2]
back = x[len(x)//2:]
mergeSort(front)
mergeSort(back)
merge(front,back, x)
x = [12,11,13,5,6,7]
mergeSort(x)
print(x) #output is [5,6,7,11,12,13] as desired
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.