【发布时间】:2017-02-24 23:54:35
【问题描述】:
我有一个如下所示的数组:
int array[] = {4.53, 3.65, 7.43, 9.54, 0.72, 0.0}
我只是想知道我可以使用什么方法对这个数组进行部分排序,从而将前三个最大的双打放在前面。我正在寻找最有效的方法来获得该数组中的前三个最高数字。
到目前为止,我一直在使用qsort,但我只是在寻找另一种可能更快的方法。我知道qsort 是最好的情况下的O(nlogn) 和最坏的情况下的O(n^2),但是有没有更有效的方法来解决这个问题?我所说的高效只是一种更快的方法,比O(nlogn) 更好。
任何帮助都会很棒
【问题讨论】:
-
你如何找到最小的数字?用三个变量做到这一点。
-
@RoadRunner 在数组中找到最极端的值是 O(n),在数组中找到
k最极端的值是 O(kn),假设k<n确实更快。 -
该方法通常称为快速选择。 en.wikipedia.org/wiki/Quickselect
-
快速选择即可。我假设部分排序会接受一个比较器,它可以满足你的需要。但是,如果您只需要前 3 个元素,那么使用 Nikhil 提出的方法可能会更快,因为大 O 常数会更低(3),而我认为 quickselect 大约为 11 左右(这可能是关闭的,不要引用我的话)根据维基百科:平均时间复杂度的更精细计算会产生 3.4n+o(n) 的最坏情况,略大于 3n。
-
partial_sort 在 C 中可用吗?