Python 解释此合并排序代码中L和R的范围? def合并排序(arr): 如果len(arr)>1: mid=len(arr)//2#查找数组的mid L=arr[:mid]#分割数组元素 R=arr[mid:][分成两半 合并排序(L)#对上半部分进行排序 合并排序(R)#对后半部分进行排序 i=j=k=0 #将数据复制到临时数组L[]和R[] 而i
尽管L和R是自变量,但它们的值如何随递归函数中L和R值的变化而变化?有人能详细解释一下吗?在python中,列表是一个可变对象,因此这里L和R是通过引用传递的,末尾的“Python 解释此合并排序代码中L和R的范围? def合并排序(arr): 如果len(arr)>1: mid=len(arr)//2#查找数组的mid L=arr[:mid]#分割数组元素 R=arr[mid:][分成两半 合并排序(L)#对上半部分进行排序 合并排序(R)#对后半部分进行排序 i=j=k=0 #将数据复制到临时数组L[]和R[] 而i,python,recursion,Python,Recursion,尽管L和R是自变量,但它们的值如何随递归函数中L和R值的变化而变化?有人能详细解释一下吗?在python中,列表是一个可变对象,因此这里L和R是通过引用传递的,末尾的“返回arr”甚至是不必要的。这意味着即使通过递归函数调用也会修改列表。 使用调试器,研究合并排序算法拆分每个项目并开始排序的关键时刻,您将更好地了解它的工作原理 但是代码的缩进有问题。您需要在函数声明下缩进所有代码,除了返回行。L和R始终是局部变量,但是mergesort会改变您传入的列表,例如arr[k]=L[i]。请注意,您正
返回arr
”甚至是不必要的。这意味着即使通过递归函数调用也会修改列表。
使用调试器,研究合并排序算法拆分每个项目并开始排序的关键时刻,您将更好地了解它的工作原理
但是代码的缩进有问题。您需要在函数声明下缩进所有代码,除了
返回
行。L
和R
始终是局部变量,但是mergesort
会改变您传入的列表,例如arr[k]=L[i]
。请注意,您正在复制每个子列表。比较这三个函数:def(L):L.append(3)
和def g(L):L=L+[4]
和def h(L):L[0]=5
。试试看:L=[1,2];印刷品(L);f(L);印刷品(L);L=[1,2];印刷品(L);g(L);印刷品(L);L=[1,2];印刷品(L);h(L);印刷品(L)
您的评论#将数据复制到临时数组L[]和R[]
有误导性。这个注释后面的while循环不是从L和R复制数据,而是从L和R复制数据。我确信从开始的所有行如果len(arr)>1:
都需要一个缩进级别,而不仅仅是前6个缩进级别。你是对的,否则在算法的其余部分中L和R将不被知道。返回行是正确的。谢谢Stef,我编辑了我的答案。
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
return arr