簡體   English   中英

Python3中的合並排序

[英]Merge Sort in Python3

我有一些有效的代碼,但我不太明白它為什么有效。 如果有人可以帶我瀏覽其中的幾部分,或者解釋我的假設錯誤的地方,我將不勝感激。

這是代碼:

def mergeSort(alist):
    print("Splitting ",alist)
    if len(alist)>1:
        mid = len(alist)//2
        lefthalf = alist[:mid]
        righthalf = alist[mid:]

        mergeSort(lefthalf)
        mergeSort(righthalf)

        i=0
        j=0
        k=0
        while i < len(lefthalf) and j < len(righthalf):
            if lefthalf[i] < righthalf[j]:
                alist[k]=lefthalf[i]
                i=i+1
            else:
                alist[k]=righthalf[j]
                j=j+1
            k=k+1

        while i < len(lefthalf):
            alist[k]=lefthalf[i]
            i=i+1
            k=k+1

        while j < len(righthalf):
            alist[k]=righthalf[j]
            j=j+1
            k=k+1
    print("Merging ",alist)

alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)

如果我理解正確,該函數將一遍又一遍地划分列表的左半部分,創建越來越小的子列表,直到它們只有一個項目長,然后移到右半部分。 那是對的嗎? EX: list=[1, 2, 3, 4, 5, 6, 7, 8] 會被分解成 [1, 2, 3, 4] 和 [5, 6, 7, 8], 那么函數就會被分解左半部分轉化為 [1, 2] 和 [3, 4],然后將 [1, 2] 轉化為 [1] 和 [2],然后再向后處理。 下一步是將 [3, 4] 分解為 [3] 和 [4],然后再返回 [5, 6, 7, 8] 並重復所有相同的步驟。 那是對的嗎?

我的另一個問題是,不應該將 i 和 j 重置為 0 以重新組合所有小子列表嗎? 例如:對於 [1] 和 [2] 變成 [1, 2] i 和 j 變成 1,但是他們不能指向 [3] 和 [4] 變成 [3, 4] 因為它們都在索引 0。我在這里遺漏了什么?

不要考慮整個過程。 遞歸思考。 誰關心哪個列表首先被分解? 您只需要知道:

  • 基本情況是否正確? 在這種情況下,您是否可以通過什么都不做來對包含 1 個或更少元素的列表進行排序? 答案是肯定的。
  • 遞歸調用是否接近基本情況? 在這種情況下,列表參數逐漸變小,最終長度為 0 或 1,所以是的。
  • 最后但並非最不重要的...假設遞歸調用做他們應該做的事情,函數的其余部分是否相應地表現? 在這種情況下,如果你拆分alist ,對每一半進行排序,然后將兩半合並到alist ,就像 3 個 while 循環一樣,它是否已排序? 答案是肯定的。

對於您的另一個問題,一次調用中的ijk完全獨立於其他調用中的那些。 即使它們不是,它們也會在while循環開始之前被設置為0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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