c - 快速排序,是否可以输出 N 维数组中的前 m 个排序值,从而比完整的 N 排序更快

标签 c algorithm quicksort

Quicksort 是一种众所周知的算法,但破译 C 很复杂(对我而言)。内联版本大大加快了速度 http://www.corpit.ru/mjt/qsort.html .

但是,它是否可以轻松转换为输出 N 元素数组的前 m 个样本?

那么在第一个 m 个样本排序后简单地停止排序的调用?我怀疑不是,因为它对 block 进行快速排序,然后将 block 拼接在一起以获得最终输出。如果我将初始快速排序 block 大小设置为 m 的大小,那么我的处境很糟糕,没有利用 qsort 中的聪明东西。

提前致谢

烈酒

最佳答案

使用Quickselect ,正如@R .. 建议的那样,获取第一个 k 元素,然后对它们进行排序。获取元素的运行时间为 O(N),对元素进行排序的运行时间为 O(k log k)。

然而,emperical evidence suggests如果要选择的项目数 (k) 小于元素总数 (N) 的 1%,则使用二叉堆将比快速选择后排序更快。当我必须从 200 万个列表中选择 200 个项目时,堆选择算法要快得多。有关详细信息,请参阅链接的博客。

关于c - 快速排序,是否可以输出 N 维数组中的前 m 个排序值,从而比完整的 N 排序更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19983038/

相关文章:

java - Java中C的fRead

c - 简单的 C 内联链接器错误

algorithm - 如果在 Hoare 快速排序中比较的元素相同怎么办?

algorithm - Quicksort面试题: Quicksort run three times

c++ - 为什么快速排序在重复元素多的情况下效率低下?

c - 使用mpi.h,如何使用mpi.h的MPI_Altoallv为每个处理器发送超过4个整数?

c - Golang C 绑定(bind)类型设计

algorithm - 如何查找矩阵中唯一直线的数量

algorithm - 有没有渐近符号的替代方法?

algorithm - 如何通过实验模拟和比较各种图循环检测算法?