问题很简单,如果我排序所有值并选择第一个K值。但是它浪费了太多时间,因为在整个数组排序之前可能已经对最小的K值进行了排序。我认为解决这个问题的方法是在代码中添加一个标志,但我无法弄清楚如何让标志判断最小的k值是否已经排序。如何使用快速排序查找K个最小值
0
A
回答
3
您可以使用random selection algorithm以O(n)时间解决此问题。最后,只需返回从0到k的子数组。
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 ...指数]在阵列中的前k个最小的值。如果您想对它们进行排序,您可以进一步对[0 ...索引]进行排序。
相关问题
- 1. 使用快速排序(Python)查找第k个最小项目
- 2. 使用快速排序的第k个最小数字
- 3. 如何实现最小堆排序来查找第k个最小元素?
- 4. 查找未排序数组中的第k个最小元素
- 5. K&R快速排序代码
- 6. 使用R排除观察值后快速找到分组的最小值
- 7. 从n个排序数组中找出k个最小数字
- 8. 在大小为N的未排序数组中查找K个最小整数
- 9. 最大和快速排序
- 10. Java int Array:查找平均值,最小值/最大值,排序
- 11. 使用修改的快速排序从阵列中选择k个最小元素的运行时错误
- 12. 外部排序与k路合并与快速排序
- 13. 使用QuickSelect第k个最小元素排序矩阵
- 14. 使用java快速排序
- 15. 查找最-K
- 16. 使用快速排序排序数组
- 17. 在未排序的向量中查找第K个最小元素(迭代式)
- 18. 在最小堆中查找k个最小元素
- 19. 知道排序数组中的最小值,如何使用二分查找?
- 20. 查找数组中K个序列项的最小总和
- 21. 如何使用nCr查找最小值和最大值?
- 22. 快速查找整数索引值使用排序的整数数组键
- 23. 以第一个元素为快速排序的快速排序
- 24. 在二维排序数组中找到k个最小\最大元素
- 25. 快速排序不排序
- 26. 快速查找
- 27. 快速查找
- 28. 快速排序功能只适用于最后一个值是最大的
- 29. K方式合并排序阵列实现使用最小堆
- 30. 如何排序比快速排序更快的整数数组?
是否意味着排序整个数组是必须的? –
不,在随机选择算法中,它并没有对整个数组进行排序,最后只是在数组[K]左侧的K个最小值。所以你只需要返回从0到K的子数组。它只是使用快速排序的分区思路,但是具有非常出色的预期运行时间。 – bhuang3
我已经阅读了wiki,我知道解决这个问题的想法。 Thx寻求帮助 –