[英]Merge Sort Problems - Python
我的代碼有什么問題? 它僅輸出vect值的一部分。 似乎while循環在某個時刻中斷。 我不明白為什么。
def print_list(vect):
for i in range(0, len(vect)):
print(vect[i])
def merge_sort(vect):
left = []
right = []
result = []
for i in range(0, int(len(vect)/2)):
left.append(vect[i])
for i in range(int(len(vect)/2), len(vect)):
right.append(vect[i])
left.sort()
right.sort()
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
print(len(result))
return result
vect = [3, 1, 5, 7, 10, 2, 0]
vect = merge_sort(vect)
好吧,你的錯誤是你的while循環之后
while i < len(left) and j < len(right):
...
i < len(left)
或j < len(right)
可能是(而且很可能是j < len(right)
,因此您需要在答案后面加上適當部分的后綴。 這很容易做到
result += left[i:]
result += right[j:]
說明:
想象一下合並過程:您在開始時將i和j設為0,然后在每一步中都將它們之一向前移動。 什么時候停止? 當其中之一到達終點時。 假設我已經結束了。 因此,您將整個左側部分添加到了結果中,但是j和len(right)之間的右側仍然有一些元素,因此您也必須將它們添加到答案中。
台面 :
您正在執行合並排序,所以請
left = merge_sort( left )
right = merge_sort( right )
代替
left.sort()
right.sort()
注意:您必須在合並功能開始時在代碼中添加以下檢查,以避免無限遞歸:
if len( vect ) == 1:
return vect
同樣在print_list函數中,您可以使用
print vect
或至少
for x in vect
print x
一旦左側或右側耗盡,while循環就會退出。 這使未用盡列表中剩余的所有元素都不會合並。
將代碼更改為此:
def print_list(vect):
for i in range(0, len(vect)):
print(vect[i])
def merge_sort(vect):
left = []
right = []
result = []
for i in range(0, int(len(vect)/2)):
left.append(vect[i])
for i in range(int(len(vect)/2), len(vect)):
right.append(vect[i])
left.sort();
right.sort();
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
if i < len(left):
result.extend(left[i:])
else:
result.extend(right[j:])
print(len(result))
return result
vect = [3, 1, 5, 7, 10, 2, 0]
vect = merge_sort(vect)
print vect
如果您在左右使用sort方法,那么為什么您不只在整個列表中使用它,我有點困惑。 但是我想你有你的理由。 :)
編輯:我把整個代碼塊放在那里,以便您可以看到它。 當我運行此命令時,它會打印[0,1,2,3,5,7,10],這是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.