Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
我的第一个排序算法Python中的Mergesort出现了什么问题? def合并排序(a): 如果len(a)_Python_Sorting_Merge - Fatal编程技术网

我的第一个排序算法Python中的Mergesort出现了什么问题? def合并排序(a): 如果len(a)

我的第一个排序算法Python中的Mergesort出现了什么问题? def合并排序(a): 如果len(a),python,sorting,merge,Python,Sorting,Merge,您的函数mergesort返回一个新列表,并且没有像您预期的那样修改您提供的列表。因此,例如,当调用mergesort(a[:mid])时,返回的是这些元素的新排序版本,而原始a[:mid]保持完全相同 编辑:这里的问题是python列表切片的工作方式。当您说a[:mid]时,python会创建原始文件的“副本”(不必担心副本的确切类型)。现在,当你在一个函数中修改这个副本时,你所要做的就是改变其中的引用以指向新的整数,而不是以任何方式修改原始的整数。下面是一些代码来充实这一点: def mer

您的函数mergesort返回一个新列表,并且没有像您预期的那样修改您提供的列表。因此,例如,当调用
mergesort(a[:mid])
时,返回的是这些元素的新排序版本,而原始
a[:mid]
保持完全相同

编辑:这里的问题是python列表切片的工作方式。当您说
a[:mid]
时,python会创建原始文件的“副本”(不必担心副本的确切类型)。现在,当你在一个函数中修改这个副本时,你所要做的就是改变其中的引用以指向新的整数,而不是以任何方式修改原始的整数。下面是一些代码来充实这一点:

def mergesort(a):
    if len(a)<=1:
        return a

    else:
        mid=len(a)/2
        mergesort(a[:mid])
        mergesort(a[mid:])
        auxa=[]
        j=0
        k=mid
        while j<mid and k<len(a):
            if a[j]<a[k]:
                auxa.append(a[j])
                j+=1
            else:
                auxa.append(a[k])
                k+=1

        if j==mid:
            auxa.extend(a[k:])

        if k==len(a):
            auxa.extend(a[j:mid])

        a=auxa


        return a

testlist=[3,2,1]   
print mergesort(testlist) 
编辑2:复制正确完成的值(如注释中的(abamert)所示):

def合并排序(a):

如果len(a)您的函数mergesort返回一个新列表,并且没有像您预期的那样修改您提供的列表。因此,例如,当调用
mergesort(a[:mid])
时,返回的是这些元素的新排序版本,而原始
a[:mid]
保持完全相同

编辑:这里的问题是python列表切片的工作方式。当您说
a[:mid]
时,python会创建原始文件的“副本”(不必担心副本的确切类型)。现在,当你在一个函数中修改这个副本时,你所要做的就是改变其中的引用以指向新的整数,而不是以任何方式修改原始的整数。下面是一些代码来充实这一点:

def mergesort(a):
    if len(a)<=1:
        return a

    else:
        mid=len(a)/2
        mergesort(a[:mid])
        mergesort(a[mid:])
        auxa=[]
        j=0
        k=mid
        while j<mid and k<len(a):
            if a[j]<a[k]:
                auxa.append(a[j])
                j+=1
            else:
                auxa.append(a[k])
                k+=1

        if j==mid:
            auxa.extend(a[k:])

        if k==len(a):
            auxa.extend(a[j:mid])

        a=auxa


        return a

testlist=[3,2,1]   
print mergesort(testlist) 
编辑2:复制正确完成的值(如注释中的(abamert)所示):

def合并排序(a):

如果len(a)我想到的是:

def mergesort(a):
  if len(a)<=1:
    return a

  else:
    mid=len(a)/2
    a = mergesort(a[:mid]) + mergesort(a[mid:])
    auxa=[]
    j=0
    k=mid
    while j<mid and k<len(a):
        if a[j]<a[k]:
            auxa.append(a[j])
            j+=1
        else:
            auxa.append(a[k])
            k+=1

    if j==mid:
        auxa.extend(a[k:])

    if k==len(a):
        auxa.extend(a[j:mid])


    return auxa
从集合导入数据
def合并排序(数组):

如果len(array)我想到的是:

def mergesort(a):
  if len(a)<=1:
    return a

  else:
    mid=len(a)/2
    a = mergesort(a[:mid]) + mergesort(a[mid:])
    auxa=[]
    j=0
    k=mid
    while j<mid and k<len(a):
        if a[j]<a[k]:
            auxa.append(a[j])
            j+=1
        else:
            auxa.append(a[k])
            k+=1

    if j==mid:
        auxa.extend(a[k:])

    if k==len(a):
        auxa.extend(a[j:mid])


    return auxa
从集合导入数据
def合并排序(数组):

如果len(array)不忽略内部
mergesort()
calls返回的值也不忽略内部
mergesort()
calls返回的值这是一个很好的解释,但我认为您也希望提供解决方案。如果您想更改前半部分,只需执行
a[:mid]=mergesort(a[:mid])
。或者,最好使用
a=mergesort(a[:mid])+mergesort(a[mid:])
从两个排序的部分中创建一个新的排序列表。我在OP的代码中没有看到
a[index]=value
的任何地方,也就是说,无论
a
部分是否作为副本传递,
a
无论如何都不会更改
local_a=whatever
对外部世界没有影响,除非它是从函数返回的。但是OP忽略了从
mergesort()
返回的值,我想这是一个解释问题。你的观点是OP打算得到他的函数的返回值并使用它,但是忘记了。事实上,他有一个返回语句支持这一点。我的观点是,他期望对传递的数组进行更改。他试图做
a=auxa
的事实支持了这一点。取决于您更同意哪一个,问题是切片复制或OP忽略返回值,争论哪一个是“真实”的对我来说没有太大意义。
local\u a=无论什么
。。。。我当然同意。问题是,OP可能不太清楚它确实是本地a。但是语义学,真的。很好的解释,但我认为你也想提供解决方案。如果您想更改前半部分,只需执行
a[:mid]=mergesort(a[:mid])
。或者,最好使用
a=mergesort(a[:mid])+mergesort(a[mid:])
从两个排序的部分中创建一个新的排序列表。我在OP的代码中没有看到
a[index]=value
的任何地方,也就是说,无论
a
部分是否作为副本传递,
a
无论如何都不会更改
local_a=whatever
对外部世界没有影响,除非它是从函数返回的。但是OP忽略了从
mergesort()
返回的值,我想这是一个解释问题。你的观点是OP打算得到他的函数的返回值并使用它,但是忘记了。事实上,他有一个返回语句支持这一点。我的观点是,他期望对传递的数组进行更改。他试图做
a=auxa
的事实支持了这一点。取决于您更同意哪一个,问题是切片复制或OP忽略返回值,争论哪一个是“真实”的对我来说没有太大意义。
local\u a=无论什么
。。。。我当然同意。问题是,OP可能不太清楚它确实是本地a。但是语义,真的。
pop(0)
O(n)
对于列表,它使您的算法是二次的,而不是通常的
O(n*logn)
对于合并排序。您可以尝试
collections.deque()
而不是
merged\u数组
列表<代码>而左数组和右数组:
按原样工作。在第一个循环之后,
left_array
right_array
为空。您可以使用
合并的数组.extend(左数组);合并的数组。扩展(右数组)而不是最后两个循环。要支持Python 3,您可以使用
/
(楼层划分)。谢谢!我没有想到这一点。
pop(0)
O(n)
对于列表,它使您的算法是二次的,而不是通常的
O(n*logn)
对于合并排序。您可以尝试
collections.deque()
而不是
merged\u数组
列表<代码>而左数组和右数组:
按原样工作。在第一个循环之后,
left_array
right_array
为空。您可以使用
合并的数组.extend(左数组);合并的数组。扩展(右数组)而不是最后两个循环。要支持Python 3,可以使用
/