Can';我不理解用python进行合并排序
我在学习算法,现在我被合并排序代码困住了。据我所知,mergeSort()函数接受一个列表并将其划分为一个子列表,直到它的长度小于2,这只是一个元素,并分配给左变量和右变量。之后,它会将这些变量传递到merge()函数中,该函数将对其进行左右排序,并将其放入一个新列表中,然后返回该列表。例如,如果输入是[4,3,2,1],那么left=4 right=3,merge(left,right,compare)将返回[3,4],然后我就卡住了。请帮助我理解这个例子。谢谢Can';我不理解用python进行合并排序,python,algorithm,sorting,mergesort,Python,Algorithm,Sorting,Mergesort,我在学习算法,现在我被合并排序代码困住了。据我所知,mergeSort()函数接受一个列表并将其划分为一个子列表,直到它的长度小于2,这只是一个元素,并分配给左变量和右变量。之后,它会将这些变量传递到merge()函数中,该函数将对其进行左右排序,并将其放入一个新列表中,然后返回该列表。例如,如果输入是[4,3,2,1],那么left=4 right=3,merge(left,right,compare)将返回[3,4],然后我就卡住了。请帮助我理解这个例子。谢谢 import operator
import operator
def merge(left, right, compare):
result = []
i,j = 0, 0
while i < len(left) and j < len(right):
if compare(left[i], right[j]):
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
while (i < len(left)):
result.append(left[i])
i += 1
while (j < len(right)):
result.append(right[j])
j += 1
return result
def mergeSort(L, compare = operator.lt):
if len(L) < 2:
return L[:]
else:
middle = len(L)//2
left = mergeSort(L[:middle], compare)
right = mergeSort(L[middle:], compare)
return merge(left, right, compare)
导入操作符
def合并(左、右、比较):
结果=[]
i、 j=0,0
而i
left=4 right=3
不能正确,因为left
和right
是列表。您可以看到这一点,因为left=mergeSort(…)
和right=mergeSort(…)
是由mergeSort
函数返回的内容定义的,它是一个列表,并且使用len(left)
和len(right)
来获取merge
函数中的列表长度,我已经创建了一个递归合并排序算法如何执行的交互式演示,您可能会发现这很有帮助-在下面的链接中选择“merge_sort(4)”,以获得与您类似的示例:是的,我的意思是left=[4]right=[3],sorry@kaya3非常感谢您,您的演示非常有用!现在我明白它是如何工作的了。谢谢需要注意的是,高效的合并排序函数涉及临时(工作)数组的一次性分配,并使用索引(或迭代器或指针)指示运行边界(对于自顶向下和自底向上的合并排序),并根据自顶向下的递归级别更改合并方向,或者基于自底向上的迭代,以避免不必要的数据复制。