Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';我不理解用python进行合并排序_Python_Algorithm_Sorting_Mergesort - Fatal编程技术网

Can';我不理解用python进行合并排序

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

我在学习算法,现在我被合并排序代码困住了。据我所知,mergeSort()函数接受一个列表并将其划分为一个子列表,直到它的长度小于2,这只是一个元素,并分配给左变量和右变量。之后,它会将这些变量传递到merge()函数中,该函数将对其进行左右排序,并将其放入一个新列表中,然后返回该列表。例如,如果输入是[4,3,2,1],那么left=4 right=3,merge(left,right,compare)将返回[3,4],然后我就卡住了。请帮助我理解这个例子。谢谢

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非常感谢您,您的演示非常有用!现在我明白它是如何工作的了。谢谢需要注意的是,高效的合并排序函数涉及临时(工作)数组的一次性分配,并使用索引(或迭代器或指针)指示运行边界(对于自顶向下和自底向上的合并排序),并根据自顶向下的递归级别更改合并方向,或者基于自底向上的迭代,以避免不必要的数据复制。