问题描述
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
。