请您查看下面的代码并帮助我理解为什么我的合并排序代码不起作用?我对这段代码做了很多更改,我尝试添加+1并尽可能从索引中删除-1,但我无法调试它。
#!/usr/bin/python
def Merge(a,p,q,r):
n1=q-p+1
n2=r-q
(l,ri)=([],[])
for i in range(n1):
l.append(a[p+i])
for j in range(1,n2+1):
ri.append(a[q+j])
l.append(float('inf'))
ri.append(float('inf'))
print 'l and ri are %s and %s' % (l,ri)
i=0
j=0
for k in range(p,r+1):
if l[i]<=ri[j]:
a[k]=l[i]
i+=1
else:
a[k]=ri[j]
j+=1
print 'a after merge is %s' % (a)
def MergeSort(a,p,r):
#print 'a,P and r are %s, %d and %d' % (a,p,r)
if p+1<r:
q=divide(r-p)
MergeSort(a,p,q)
print 'After MS of %d and %d' % (p,q)
MergeSort(a,q+1,r)
print 'After 2nd MS of %d and %d' % (q+1,r)
print 'Before Mer of %d and %d and %d' % (p,q,r)
Merge(a,p,q,r)
def divide(number):
Q,R=divmod(number,2)
return Q+int(bool(R))
if __name__=="__main__":
a=[2,9,6,5,4]
MergeSort(a,0,len(a)-1)
print a
是因为我的数组以0索引开头吗?
答案 0 :(得分:1)
虽然我通常不支持调试解决方案,但是你的问题很多。我相信您可以在Code Review StackExchange site上分享您的代码,以获得更多有用的评论和做法。
我在代码中发现的问题与以下几行有关:
q=divide(r-p)
)的理解不足。如果p = 8
和r = 10
,那么您将获得q = divide(2)
,即1。因此,您将调用MergeSort(a, 8, 1)
和MergeSort(a, 2, 10)
- 这非常错误。< / LI>
希望这有帮助!