为什么在合并排序算法中需要递归

问题描述

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)有什么意义,即使您删除此递归,我们也可以获得排序后的列表。那为什么有必要呢?上面的代码是直接从极客那里获取的,对于其他极客,我也已经在许多其他地方看到了这种归类的递归。使用它有什么意义。

一个问题是:mergeSort(L)甚至mergeSort(R)如何在没有任何return语句的情况下返回任何内容,因为它只是失败而在arr的长度小于1时什么也不返回

解决方法

没有递归的mergeSort函数不会对数组进行排序,它只是合并(因此得名)应该已经排序的两个部分。这就是为什么您需要在合并数组的每一半之前调用该函数。

而且mergeSort不返回任何东西,它只是对数组进行排序,并且对于长度小于1的数组不做任何事情,因为这样就没有要排序的元素。

,

如果您删除了递归调用,您将只合并L = [12,11,13]R = [5,6,7]的两个部分。

内容或arr将变成[5,7,12,13]已排序。

您可能已经用两个均已排序的数组进行了测试,但是在一般情况下,需要递归。

mergeSort不返回任何内容,它会在适当位置更新arr