簡體   English   中英

歸並排序問題,遞歸過程中代碼錯誤

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

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