排序没有正确进行。有人可以帮助用这种方法进行分类。还请让我知道我哪里出错了。我是Python的新手,所以我自己这样做。我正在使用通常的方法,就像我们用C语言或其他语言一样。
base =[5,4,3,2,1]
def splitarray (low, high):
if low < high:
mid = (high+low)/2
splitarray (low, mid)
splitarray (mid+1,high)
merge(low,mid,high)
else:
return
def merge(low,mid,high):
print("merge " +str(low) + " - " +str(mid)+" - "+ str(high))
result = [0]*len(base)
k = 0
i=low
j=mid+1
l=0
while i <= mid and j <= high:
if (base[i] < base[j]):
result[k]= base[i]
k+=1
i += 1
if (base[i] > base[j]) :
result[k]= base[j]
j += 1
k += 1
while i <= mid:
result[k]= base[i]
k += 1
i += 1
while j <= high:
result[k]= base[j]
#count = count + mid - i
j += 1
k += 1
print result
l = low
k= 0
while l <= high:
base[l] = result[l]
l += 1
print base
splitarray(0,len(base)-1)
答案 0 :(得分:2)
因此,实现合并排序最明显的方法是为每个合并返回一个新列表。也许这可以针对您尝试做的事情进行优化,即在单个顶级result
上运行。但是如果你这样做,你就不能在每个合并级别附加result
。因为在递归的底层,你将添加四个元素,然后在中间级别添加四个元素,然后在顶层你将添加另外四个元素。它太多了。如果你这样做,你应该有一个固定的result
大小,并在整个执行过程中操作它的索引。
第二个错误是你正在为每次合并阅读未经修改的base
。每个合并步骤的前提条件是合并的两个列表已经排序。如果您以显而易见的方式实现算法,则可以使用更深层合并的返回值。如果您使用顶级result
以某种优化方式实施算法,那么您应该从result
开始,而不是base
。
答案 1 :(得分:1)
您当前(已更新)代码的问题似乎与最后一个循环有关:</ p>
l = low
k= 0
while l <= high:
base[l] = result[l]
l += 1
此处您将值从results
列表复制到base
列表。但是,结果都在results
的开头,而不是您希望它们进入base
的相同坐标。您似乎已将几乎弄好了,因为您将k
设置为零,但您最终不会在循环中使用k
。
尝试:
l = low
k= 0
while l <= high:
base[l] = result[k] # read the result from index k, not l
l += 1
k += 1 # increment k as well
这应该按预期工作。请注意,虽然这将正确地进行排序,但这不是一种非常优雅的Python排序方式。首先,您只能对一个全局变量base
进行排序,而不是任何列表(将列表作为参数传递会更好)。但是,由于这看起来像是你为学习经历写的主要内容,我会给你留下进一步的改进。