为什么我的python合并排序不起作用?

时间:2015-10-20 05:53:18

标签: python algorithm sorting merge mergesort

请您查看下面的代码并帮助我理解为什么我的合并排序代码不起作用?我对这段代码做了很多更改,我尝试添加+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索引开头吗?

1 个答案:

答案 0 :(得分:1)

This code should be working.

虽然我通常不支持调试解决方案,但是你的问题很多。我相信您可以在Code Review StackExchange site上分享您的代码,以获得更多有用的评论和做法。

我在代码中发现的问题与以下几行有关:

  1. 指数的可怕表示。您使用了封闭和半开放间隔。如果您可以投入一些时间来提高对此的理解,那么您将不会做出如此多的错误或修复。
  2. 没有间距 - 您的代码根本不可读。虽然为了清晰起见,我没有花太多时间编辑它,但你可以清楚地看到我的更改,使其更具可读性。
  3. 其他小错误,表明对合并排序算法或编程语言(例如行q=divide(r-p))的理解不足。如果p = 8r = 10,那么您将获得q = divide(2),即1。因此,您将调用MergeSort(a, 8, 1)MergeSort(a, 2, 10) - 这非常错误。< / LI>
  4. 命名约定,您可以使用有意义的变量名称来帮助自己。这将显着缩短您的调试时间。
  5. 希望这有帮助!