使用quicksort查找第k个最小的项目(Python)

时间:2015-11-20 06:29:56

标签: python algorithm quicksort

我正在尝试实施this videothis document中讨论的算法。

我的快速排序代码,取决于选择数组中的中间元素作为支点(见下文),而不是上面文档的作者使用数组中的第一个元素作为shown here in the video的轴。

显然,我的代码不起作用(最终用完递归限制)。我想知道是不是因为我的代码中出现了一些愚蠢的错误,或者只要我从中间选择枢轴就不行。

def partition(a, start, end):
    # I pick the pivot as the middle item in the array
    # but the algorithm shown in the video seems to
    # pick the first element in the array as pivot
    piv = (start + end) // 2
    pivotVal = a[piv]

    left = start
    right = end

    while left <= right:

        while a[left] < pivotVal:
            left += 1

        while a[right] > pivotVal:
            right -= 1

        if left <= right:
            temp = a[left]
            a[left] = a[right]
            a[right] = temp
            left += 1
            right -= 1

    return left


def quicksort(a, start, end, k):

    if start < end:
        piv = partition(a, start, end)

        if piv == (k - 1):
            print("Found kth smallest: " + piv)
            return a[piv]
        elif piv > (k - 1):
            return quicksort(a, start, piv, k)
        else:
            return quicksort(a, piv + 1, end, k)

myList = [54, 26, 93, 17, 77, 31, 44, 55, 20]
quicksort(myList, 0, len(myList) - 1, 3)
print(myList)

1 个答案:

答案 0 :(得分:0)

如果您正在使用包含数组边界,这不是最方便的技巧,则必须将递归调用的范围更改为[start, piv - 1][piv + 1, end]

原因是,您正在重新考虑每个递归到数组左侧的piv元素。

包含所述更改的代码在没有任何堆栈溢出错误的情况下运行。

编辑输出不适合k的少数值。您可能需要再次检查分区逻辑。