python - 为什么在归并排序算法中需要递归
问题描述
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)
甚至返回任何内容,因为它只是失败并且当长度为 < 1 时什么也不返回。mergeSort(R)
return
arr
解决方案
没有递归的 mergeSort 函数不对数组进行排序,它只是合并(因此得名)应该已经排序的两半。这就是为什么在合并两者之前需要在数组的每一半上调用函数的原因。
此外,mergeSort 不会返回任何内容,它只是对数组进行排序,并且不会对长度小于 1 的数组执行任何操作,因为这样就没有要排序的元素了。
推荐阅读
- ietf-netmod-yang - 为什么名称类型的叶节点在 yang 模型中不起作用?
- json - 如何将lua表对象解析为json?
- html - 以浮动外框为中心定位模态
- javascript - RXJS 去抖动和修改 BehaviourSubject
- javascript - 如何在 Javascript 中从 http 源返回图像
- supervisord - 错误:.ini 文件不包括 UBUNTU 中的 supervisorctl 部分
- java - 在 java android google map 中显示和更新标记的图标
- python-3.x - 使用 LSTM 训练的模型只预测所有相同的值
- reactjs - 如何用 jest 测试反应请求参数?
- python - 你如何在python中使用beautifulsoup从带有“data-reactid”的“span”标签中抓取数据?