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