如何在Python中修复此QuickSort分区?(处理numpy阵列)



我已经在此QuickSort分区上工作了几天,但仍然无法修复它。我尝试使用打印件调试它,以查看主QuickSort调用时的分区如何发展,但仍然不知道如何修复它。向医生展示上下文,如果不相关的话,道歉。

它可以在一些示例上使用,但在其他示例中不起作用,无法弄清楚为什么。任何洞察力和帮助。

def partition (s, cmp):
>>> import generate
>>> import numpy
>>> import element
>>> def cmp (x,y):
...    if x == y:
...       return 0
...    elif x < y:
...       return -1
...    else:
...       return 1
>>> t = numpy.array([element.Element(i) for i in [3, -8, 2 , -2, 3, 7, 9, 1, -1, 7]])
>>> p = {'left':0,'right':len(t)-1,'data':t}
>>> p1,p2 = partition(p,cmp)
>>> p1['data'][p1['left']:p1['right']+1]
array([-8, 2, -2, 3, -1, 1], dtype=object)
>>> p2['data'][p2['left']:p2['right']+1]
array([9, 7, 7], dtype=object)
"""
    a = s["data"]   #whole array
    lp = s["left"]+1  #left pointer
    rp = s["right"]    #right pointer
    pivot = a[lp-1]    #pivot is element of index lp=0 in slice
    while lp <= rp:
        if cmp(a[lp], pivot) <= 0:  #lp is already on the correct side since it's <= to pivot
            a[lp-1] = a[lp]
            lp += 1   #moving towards center
        else:
            a[lp], a[rp] = a[rp], a[lp] #taking advantage of python's easy swap
            rp -= 1     #moving towards center
    a[rp] = pivot   #replacing pivot in the end
    lslice = {"data" : a, "left" : s["left"], "right" : rp-1}   #<pivot
    rslice = {"data" : a, "left" : rp+1, "right" : s["right"]}  #>pivot
    return (lslice,rslice)

最终发现了这个问题,新秀错误。它本身不是来自该程序,而是来自测试定义,

>>> p0 = {'left':0,'right':len(t)-1,'data':t1}

必须是

>>> p0 = {'left':0,'right':len(t1)-1,'data':t1}

最新更新