【问题标题】:Why is my python merge sort not working?为什么我的 python 合并排序不起作用?
【发布时间】:2016-01-18 15:52:54
【问题描述】:

您能否查看以下代码并帮助我理解为什么我的合并排序代码不起作用?我对这段代码做了很多修改,我尝试在可能的情况下从索引中添加 +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 索引开始的?

【问题讨论】:

    标签: python algorithm sorting merge mergesort


    【解决方案1】:

    This code should be working.

    虽然我通常不支持调试解决方案,但您的解决方案存在很多问题。我相信您最好在Code Review StackExchange site 上分享您的代码,以便获得更多有用的 cmets 和实践。

    我在您的代码中发现的问题大致如下:

    1. 糟糕的指数表现。您同时使用了封闭区间和半开区间。如果您可以投入一些时间来加深对这一点的理解,那么您就不会犯太多错误或修正。
    2. 没有间距 - 您的代码根本无法阅读。虽然为了清晰起见我没有花太多时间对其进行编辑,但您可以清楚地看到我所做的更改以使其更具可读性。
    3. 其他小错误,表明对归并排序算法或编程语言的理解不佳 - 例如行 q=divide(r-p)。如果p = 8 和r = 10,那么您将得到q = divide(2),即1。因此,您将调用MergeSort(a, 8, 1) 和MergeSort(a, 2, 10) - 这是非常错误的。
    4. 命名约定,您可以通过使用有意义的变量名来帮助自己。这将显着缩短您的调试时间。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-19
      • 2021-04-23
      • 2019-11-12
      • 2016-02-06
      • 2019-07-31
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多