1

我需要在数组中找到第 n 个最大的元素,目前我正在按照以下方式进行操作:

std::vector<double> buffer(sequence); // sequence is const std::vector<double>
std::nth_element(buffer.begin(), buffer.begin() + idx, buffer.end(), std::greater<double>());
nth_element = buffer[idx];

但是有没有办法在不使用外部缓冲区的情况下找到数组中的第 n 个最大元素?

4

2 回答 2

9

您可以避免在不修改原始范围的情况下复制整个缓冲区,使用std::partial_sort_copy. 只需将部分排序的范围复制到较小的 size 缓冲区中n,然后取最后一个元素。

如果您可以修改原始缓冲区,那么您可以简单地std::nth_element在原地使用。

于 2016-04-07T11:02:21.710 回答
0

您可以使用快速排序中使用的分区函数来查找第 n 个最大的元素。

分区函数会将原始数组分成两部分。第一部分会小于A[i],第二部分会大于A[i],partition会返回i。如果i等于n,则返回A[i]。如果i小于n,则划分第二部分。如果i大于n,则划分第一部分。

它不会花费你额外的缓冲,平均时间成本是 O(n)。

于 2016-04-07T10:57:15.813 回答