基于Python的quickselect实现导致错误

时间:2013-02-02 07:16:46

标签: python python-3.x pyscripter quickselect

我有一些小python代码,用于实现所讨论的quickselect here

import random
def Quickselect(A, k):
    if not A:
        return
    pivot = random.choice(A)

    i = 0
    A1 = []
    A2 = [] # Two new arrays A1, A2 to store the split lists
    for i in range(len(A)):
        if A[i] < pivot :
            A1.append(A[i])
        else:
            A2.append(A[i])

    if k < len(A1):
        return Quickselect(A1, k)
    if k > len(A) - len(A2):
        return Quickselect(A2, k-(len(A) - len(A2)))
    else:
        return pivot
pass
def main():
    A = [45,1,27,56,12,56,88]
    print(Quickselect(A,2))
pass

我似乎得到了一个randrange错误。有什么不对劲吗?

修改:已实施random.choice而不是random.randint。 上面的代码似乎工作正常。感谢用户Blender。

1 个答案:

答案 0 :(得分:1)

您的错误发生是因为randrange在范围为空(即randrange(1, 1))时中断。

改为使用random.choice并将k <= len(A1)更改为k < len(A1)

def quick_select(A, k):
    pivot = random.choice(A)

    A1 = []
    A2 = []

    for i in A:
        if i < pivot:
            A1.append(i)
        elif i > pivot:
            A2.append(i)
        else:
            pass  # Do nothing

    if k <= len(A1):
        return Quickselect(A1, k)
    elif k > len(A) - len(A2):
        return Quickselect(A2, k - (len(A) - len(A2)))
    else:
        return pivot