簡體   English   中英

為什么在合並排序算法中需要遞歸

[英]Why recursion is needed in Merge sort algorithm

def mergeSort(arr): 
    if len(arr) > 1: 
        mid = len(arr) // 2 # Finding the mid of the array 
        L = arr[:mid]       # Dividing the array elements  
        R = arr[mid:]       # into 2 halves 
  
        mergeSort(L)        # Sorting the first half 
        mergeSort(R)        # Sorting the second half 
  
        i = j = k = 0
          
        # Copy data to temp arrays L[] and R[] 
        while i < len(L) and j < len(R): 
            if L[i] < R[j]: 
                arr[k] = L[i] 
                i += 1
            else: 
                arr[k] = R[j] 
                j += 1
            k += 1
          
        # Checking if any element was left 
        while i < len(L): 
            arr[k] = L[i] 
            i += 1
            k += 1
          
        while j < len(R): 
            arr[k] = R[j] 
            j += 1
            k += 1

def printList(arr): 
    for i in range(len(arr)):         
        print(arr[i], end = " ") 
    print() 
 

if __name__ == '__main__': 
     arr = [12, 11, 13, 5, 6, 7]  
     print("Given array is", end = "\n")  
     printList(arr) 
     mergeSort(arr) 
     print("Sorted array is: ", end = "\n") 
     printList(arr)

在上面的代碼中使用mergeSort(L)mergeSort(R)有什么意義,因為即使你刪除了這個遞歸,我們也可以得到排序列表。 那為什么有這個必要呢? 上面的代碼直接取自 geeks for geeks,我也在許多其他地方看到了合並排序中的這種遞歸。 使用它有什么意義。

另一個問題是: mergeSort(L)甚至mergeSort(R)在沒有任何return語句的情況下返回任何內容,因為當arr長度 < 1 時,它只會失敗並且不返回任何內容。

沒有遞歸的 mergeSort 函數不會對數組進行排序,它只是合並(因此得名)應該已經排序的兩半。 這就是為什么您需要在合並兩個數組之前在數組的每一半上調用該函數的原因。

此外,mergeSort 不返回任何內容,它只是對數組進行原地排序,並且不會對長度小於 1 的數組執行任何操作,因為這樣就沒有要排序的元素了。

如果刪除遞歸調用,則只需合並兩半L = [12, 11, 13]R = [5, 6, 7]

內容或arr將變為[5, 6, 7, 12, 11, 13]排序。

您可能已經用一個數組進行了測試,其中兩半都已經排序,但在一般情況下,需要遞歸。

mergeSort不返回任何內容,它會更新arr到位。

暫無
暫無

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

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