如何使用快速排序找到K个最小值

时间:2012-12-05 05:23:07

标签: algorithm quicksort

如果我对所有值进行排序并选择第K个值,问题就很简单了。但它浪费了太多时间,因为可能在整个数组排序之前已经对最小的K值进行了排序。我认为解决这个问题的方法是在代码中添加一个标志,但我无法弄清楚如何设置标志来判断最小的k值是否已被排序。

2 个答案:

答案 0 :(得分:3)

您可以使用random selection algorithm在O(n)时间内解决此问题。最后,只需将子数组从0返回到k。

答案 1 :(得分:2)

我认为问题可以通过找到第k个最小值来解决。假设快速排序中函数partition的签名是int partition(int* array, int start, int end),这里是伪代码,它说明了基本思想:

int select(int[] a, int start, int end, int k)
{
    j = partition(a,start,end);

    if( k == j)
        return a[j];
    if( k < j )
        select(a,start,j-1,k);
    if( k > j )
        select(a,j+1,end,k-j);
}

index = select(a, 0, length_of_a, k);

然后[0 ... index]是数组a中的前k个最小值。如果要对它们进行排序,可以进一步对[0 ...索引]进行排序。