sort
我们都知道,在对一维数组或Vector排序,可以直接调用STL的算法sort进行排序。
vecotr<int> nums{1,4,2,3};
sort(nums.begin(),nums.end());//默认升序 从小到大
//sort(nums.begin(),nums.end(),greater());//降序 从大到小
二维数组排序
做题时,经常会遇到对二维数组排序。举个例子,现在有一个年级乱序数学成绩表sorce[class][sorce]
班级 | 成绩 |
---|---|
1 | 90 |
3 | 80 |
2 | 92 |
1 | 95 |
3 | 91 |
2 | 97 |
现在要求按照班级从小到大输出,同班级的按照成绩从大到小输出。
如果直接调用sort排序会得到,会得到一个按照出现顺序的排序,不符合要求。
vector<vector<int>> nums1{{1,90},{3,80},{2,92},{1,95},{3,91},{2,97}};
sort(nums1.begin(),nums1.end());
方法1: Lambda表达式
vector<vector<int>> nums1{{1,90},{3,80},{2,92},{1,95},{3,91},{2,97}};
sort(nums1.begin(),nums1.end(),[](vector<int> &a,vector<int> &b){
return a[0]==b[0] ? a[1]>b[1] : a[0]<b[0];
});
方法2:自定义函数
#include<bits/stdc++.h>
using namespace std;
//自定义函数
static bool mysort(vector<int> &a,vector<int> &b){
if(a[0]==b[0])
return a[1]>b[1];
return a[0]>b[0];
}
int main(){
vector<vector<int>> nums2{{1,90},{3,80},{2,92},{1,95},{3,91},{2,97}};
sort(nums2.begin(),nums2.end(),mysort);
for(auto x:nums2){//打印结果
for(auto y:x)
cout<<y<<" ";
cout<<endl;
}
}
以上就是二维数组排序的实现方法,读者可以根据题目要求,修改Lamdad表达式和自定义函数中的 比较符号 实现。
#include<bits/stdc++.h>
using namespace std;
//自定义函数
static bool mysort(vector<int> &a,vector<int> &b){
if(a[0]==b[0])
return a[1]>b[1];
return a[0]<b[0];
}
//打印结果
void show(vector<vector<int>> temp){
for(auto x:temp){
for(auto y:x)
cout<<y<<" ";
cout<<endl;
}
}
int main(){
vector<vector<int>> nums{{1,90},{3,80},{2,92},{1,95},{3,91},{2,97}};
vector<vector<int>> nums1=nums;
vector<vector<int>> nums2=nums;
//直接调用sort
sort(nums.begin(),nums.end());
show(nums);
//1. Lamdad表达式
cout<<endl<<"*******Lambda表达式*******"<<endl;
sort(nums1.begin(),nums1.end(),[](vector<int> &a,vector<int> &b){
return a[0]==b[0] ? a[1]>b[1] : a[0]<b[0];
});
show(nums1);
//2.自定义函数
cout<<endl<<"*******自定义函数*******"<<endl;
sort(nums2.begin(),nums2.end(),mysort);
show(nums2);
}