我的第一个排序算法Python中的Mergesort出现了什么问题? def合并排序(a): 如果len(a)
您的函数mergesort返回一个新列表,并且没有像您预期的那样修改您提供的列表。因此,例如,当调用我的第一个排序算法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(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,可以使用/