库里斯托 2024-03-01 20:27 采纳率: 87.6%
浏览 4

C++不完全排序nth_element

#include <iostream>
using namespace std;
#include <vector>
#include <algorithm> 
void test01() {
    vector<int>v = { 5,1,3,9,11,18,6 };
    nth_element(v.begin(), v.begin() + 4, v.end());
    for (vector<int>::iterator it = v.begin(); it!=v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
int main() {
    test01();
    system("pause");
    return 0;
}

//正常不应该是11处在正确的位置,前面后面的任意排吗?但为什么遍历结果是完全排好序的。

  • 写回答

4条回答 默认 最新

  • 关注

    库里斯托 晚上好🌙🌙🌙
    本答案参考通义千问

    在C++中,std::nth_element()函数的作用是将一个未排序的序列分区,使得第n个元素(这里的索引是从0开始的)处于其正确的位置,即比它小的元素都在它之前,比它大的元素都在它之后。但并不保证前n个元素和后n个元素内部有序

    对于您给出的代码:

    vector<int>v = { 5,1,3,9,11,18,6 };
    nth_element(v.begin(), v.begin() + 4, v.end());
    

    这里调用nth_element()函数将找到第5个元素(从0开始计数,即索引为4的元素),并将其放在正确的位置上。所以11会移动到中间,确保它前面的所有元素都不大于它,后面的所有元素都不小于它。但由于特定的输入数据和算法实现的原因,在这个例子中,输出结果恰好看起来像是完全排好序的,但实际上这只是巧合,并不保证每次都会这样。

    遍历结果:

    1 3 5 6 11 18 9
    

    可以看到,11位于正确的位置,且其前面的元素都小于它,后面的元素都大于它,但前面和后面的元素并没有严格排序。例如,9应当在6之后,但由于nth_element并不保证额外部分的排序,所以出现了这样的结果。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月1日

悬赏问题

  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测