用Python做归并排序法出错,求高人指点

2013-04-30 15:50:34 +08:00
 meggy911
def merge_sort(array,p,q,r):
n1 = q-p
n2 = r-q+1
l = np.zeros(n1+1)
r = np.zeros(n2+1)
for i in range(0,n1):
l[i] = array[p+i]
for j in range(0,n2):
r[j] = array[q+j]
#return r
l[n1] = float("inf")
r[n2] = float("inf")
#return l[0]
l = sorted(l)
r = sorted(r)
#return r
i = 0
j = 0
for k in range(p,r):
if l[i] <= r[j]:
array[k] = l[i]
i = i+1
else:
array[k] = r[j]
j = j+1
return array
上面的代码是基于MIT的算法导论一书写的,运行后报错如下:

>>> merge_sort([4,8,12,1,7,3,9],0,3,6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 16, in merge_sort
TypeError: range() integer end argument expected, got list.


请问这是什么原因?代码中加了注释的return r/l用于查错,都没有明显问题,个人怀疑从带k的循环中出现问题,求指导啊求指导!
6169 次点击
所在节点    Python
7 条回复
013231
2013-04-30 16:29:00 +08:00
你不是已經寫出錯誤原因了嗎:
TypeError: range() integer end argument expected, got list.
Ziya
2013-04-30 16:30:17 +08:00
merge_sort的参数r,在def时又定义为一个列表了
range的参数应该是整数,但是你给它了一个列表
meggy911
2013-04-30 16:39:15 +08:00
@Ziya 嗯知道了,本来用l/r表示左右列表的,忘了merge里面还用r定义了数组下标,粗心大意害死人啊
kaifengjin
2013-04-30 18:25:29 +08:00
既然是排序算法实现,还用sorted。。。你这只是把原数组分成了两部分,然后用sorted对两部分分别排序,再合并。。。这个分治的过程应该是递归的吧,这样才能体现归并排序啊
meggy911
2013-04-30 19:58:44 +08:00
@kaifengjin 嗯确实呀,主要是教材里假设子数组已经排序,自己又刚开始学,所以只会照着教材一步一步来,后面一点就开始介绍递归了
kaifengjin
2013-05-01 13:01:03 +08:00
@meggy911 你可以学习下这里的实现https://github.com/nryoung/algorithms 基本上也是按照算法导论来的。不过建议是先自己根据对书的理解实现,然后再对比看看别人是怎么实现的。
meggy911
2013-05-02 16:59:24 +08:00
@kaifengjin 好的,非常感谢!!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/67380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX