簡體   English   中英

合並排序有問題

[英]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進行更改。

為了解決這個問題,只需將來自mergeSortx輸入到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.

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