取中位数(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吧
#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;
}
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); //指定排序规则,从大到小