簡體   English   中英

合並排序問題-Python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM