如何按 std::nth_element 函数对值进行排序?

How can I sort value by std::nth_element function?

提问人:Alif 提问时间:3/9/2023 最后编辑:JeJoAlif 更新时间:3/11/2023 访问量:110

问:

实际上,我正在尝试获取部分排序的值。我在这里使用了函数,但它没有给我预期的结果。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
C++ 算法 17 C+ +-标准库

评论


答:

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)

如果只想使用此函数的完整订单,则需要多次应用它,无论是递归还是循环。


1) https://en.cppreference.com/w/cpp/algorithm/nth_element