c++中sort函数为什么无效

取中位数(n为奇数)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[1000];
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    cout<<a[(n+1)/2];
    return 0;
}

sort函数为什么无效?

如果是0到n-1的话,中位数应该是(n-1)/2吧

img

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[1000];
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a, a+n);
    cout<< a[(n+1)/2 - 1];
    return 0;
}
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7784137
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C++中的sort函数对二维数组排序是按照什么准则?
  • 除此之外, 这篇博客: C++中sort函数中的 哪些容器能用sort函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • string容器
    vector容器
    deque容器
    以上三种容器都可以使用sort函数。

    以下几种容器不能使用sort函数。
    C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示:

    集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
    std::set红黑树有序O(nlogn)O(nlogn)
    std::multiset红黑树有序O(nlogn)O(nlogn)
    std::unordered_set哈希表无序O(1)O(1)

    红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。

    映射底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
    std::map红黑树key有序key不可重复key不可修改O(nlogn)O(nlogn)
    std::multimap红黑树key有序key可重复key不可修改O(nlogn)O(nlogn)
    std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1)

    此外,map支持下标操作,set不支持下标操作。
    以上两表来源

    从上面表格可以看出set、multiset、map、multimap、unordered_set、unordered_map都不能使用sort函数进行排序。
    如果需要将其排序的话,需要借助vector容器。

    unordered_map<char, int> map;
    //map容器赋值后,再新建一个vector容器,并初始化如下:
    vector<pair<char, int>> v(map.begin(), map.end());
    

    从而再借助自定义的sort函数中comp排序规则

    //以map中value值的升序排序
    bool mysort(pair<char, int>& p1, pair<char, int>& p2) {
    	return p1.second < p2.second;
    }
    //从而运用sort函数排序
    sort(v.begin(), v.end(), mysort);
    

    对于list容器的sort函数,不能使用algorithm下的sort()函数,但是可以使用list容器自带的sort进行排序

    list<int> l;
    l.sort(); //默认从小到大排序
    

    也可以自定义排序

    bool myCompare(int val1 , int val2)
    {
    	return val1 > val2;
    }
    l.sort(myCompare);  //指定排序规则,从大到小
    
  • 您还可以看一下 李宁老师的征服C++ 11视频精讲课程中的 用于对容器中元素值排序的sort函数小节, 巩固相关知识点