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

Algorithm 如何使用快速排序查找K个最小值,algorithm,quicksort,Algorithm,Quicksort,如果我对所有值进行排序并选择第一个K值,问题很简单。但是它浪费了太多的时间,因为在对整个数组进行排序之前,可能已经对最小的K值进行了排序。我认为解决这个问题的方法是在代码中添加一个标志,但我不知道如何使用标志来判断最小的k值是否已排序。我认为可以通过查找第k个最小值来解决这个问题。假设quicksort中函数partition的签名是int partition(int*array,int start,int end),下面是伪代码,它说明了基本思想: int select(int[] a, in

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

我认为可以通过查找第k个最小值来解决这个问题。假设quicksort中函数
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);
int选择(int[]a,int开始,int结束,int k)
{
j=分区(a,开始,结束);
如果(k==j)
返回a[j];
if(kj)
选择(a,j+1,end,k-j);
}
索引=选择(a,0,长度a,k);

那么[0…索引]是数组a中的前k个最小值。如果希望对[0…索引]进行排序,您可以对其进行进一步排序。

我认为可以通过查找第k个最小值来解决此问题。假设quicksort中函数
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);
int选择(int[]a,int开始,int结束,int k)
{
j=分区(a,开始,结束);
如果(k==j)
返回a[j];
if(kj)
选择(a,j+1,end,k-j);
}
索引=选择(a,0,长度a,k);

那么[0…索引]是数组a中的前k个最小值。如果希望对[0…索引]进行排序,可以对其进行进一步排序。

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

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

这意味着必须对整个数组进行排序吗?不,在随机选择算法中,它不会对整个数组进行排序,最后,数组[k]左侧的k个最小值。因此,您只需要将子数组从0返回到K。它只使用了快速排序的分区思想,但具有非常出色的预期运行时间。我阅读了wiki,我知道解决此问题的方法。这意味着必须对整个数组进行排序吗?不,在随机选择算法中,它不会对整个数组进行排序,最后,K个最小值正好位于数组[K]的左侧。因此,您只需要将子数组从0返回到K。它只使用了快速排序的分区思想,但具有非常出色的预期运行时间。我阅读了wiki,我知道解决此问题的方法。谢谢你的帮助