在python中快速选择的实现。函数不稳定并返回不同的值

时间:2016-05-02 20:04:32

标签: python algorithm quicksort quickselect

我尝试使用快速选择来查找列表中的第m个最小数字。当我运行程序时,它会在某个时间返回正确的值,并在同一个数组上返回不正确的值。我做错了她是代码

def select_mth_smallest(A, m):
    pivot = np.random.choice(A)
    # split into 3 partitions
    A1 = [] 
    A2 = []
    A3 = []
    for item in A:
        if item < pivot:
            A1.append(item)
        if item > pivot:
            A3.append(item)
        else:
            A2.append(item)
    #find where m'th largest element is and recurse accordingly
    if len(A1) >= m:
        return select_mth_smallest(A1, m)
    elif (len(A1) + len(A2)) >= m:
        return pivot
    else:
        return select_mth_smallest(A3,m - (len(A1)+len(A2)))

这是算法失败的输入。

A = [1,2,3,4,5]

select_mth_smallest(A,5)

当我反复执行以上陈述时,我会交替地得到,5(正确)和4(不正确)。

特别困惑我的一件事(我是python的新手)是为什么我在使用相同的输入重复时为函数获得不同的返回值。看起来很零星.. BTW我正在使用Jupyter

1 个答案:

答案 0 :(得分:2)

您正在向多个分区添加一些项目。

    if item < pivot:
        A1.append(item)
    if item > pivot:
        A3.append(item)
    else:
        A2.append(item)

A1是小于枢轴的项目集。 A3是大于枢轴的项目集。但是,A2小于或等于的项目集,因为第二个if语句为所有项执行,并且一个或另一个分支将执行。

您需要一个带有ifelif子句的单else语句。

    if item < pivot:
        A1.append(item)
    elif item > pivot:
        A3.append(item)
    else:
        A2.append(item)