提问人:Alif 提问时间:3/9/2023 最后编辑:JeJoAlif 更新时间:3/11/2023 访问量:110
如何按 std::nth_element 函数对值进行排序?
How can I sort value by std::nth_element function?
问:
实际上,我正在尝试获取部分排序的值。我在这里使用了函数,但它没有给我预期的结果。std::nth_element
#include <bits/stdc++.h>
using namespace std;
void print(vector<int>data)
{
for(int i:data)
cout<<i<<" ";
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r+", stdin);
freopen("output.txt", "w+", stdout);
#endif
vector<int> v({5,7,4,2,8,6,1,9,0,3});
auto middle=v.begin()+v.size()/2;
nth_element(v.begin(), middle ,v.end(), greater<int>());
print(v);
}
预期结果是
9 8 7 6 5 4 1 2 0 3
但我得到了这个
6 7 9 8 5 4 1 2 0 3
答:
2赞
Bob__
3/9/2023
#1
我们来看看算法1的描述,强调我的:
template< class RandomIt > // (1) void nth_element( RandomIt first, RandomIt nth, RandomIt last ); template< class RandomIt, class Compare > // (3) void nth_element( RandomIt first, RandomIt nth, RandomIt last, Compare comp );
nth_element
是一种部分排序算法,它重新排列 [first, last] 中的元素,以便:
- 第 n 个指向的元素将更改为如果对 [first, last] 进行排序时该位置将出现的任何元素。
- 新第 n 个元素之前的所有元素都小于或等于新第 n 个元素之后的元素。
更正式地说,按升序对范围 [first, last] 进行部分排序,以便满足 [first, nth) 范围内的任何
i
] 和[nth, last]
范围内的任何j
的条件(for (1-2) 或 for (3-4))。放置在第 n 个位置的元素正是如果范围完全排序时将出现在该位置的元素。
nth_element
!(*j < *i)
comp(*j, *i) == false
请注意,它并没有说范围会被排序,也不会说范围会被排序,它只保证了第 n 个元素的位置。您可以将其视为一种分区算法。[first, nth)
[nth, last)
如果只想使用此函数的完整订单,则需要多次应用它,无论是递归还是循环。
评论