sort函数
sort
是C++的STL中非常常用的排序函数,头文件为<algorithm>
sort(start,end,cmp);
其中start
、end
分别为参与排序的首尾地址,函数将[start,end)范围内的元素进行排序
cmp
为比较规则,默认值为从小到大。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int t[10]={3,4,2,1,8,7,5,6,9,0}; //乱序
sort(&t[0],&t[10]); //从小到大排序,由于是左闭右开区间,故为地址应该为&t[10]而不是&t[9]
for(int i=0;i<10;i++)
cout<<t[i]<<" ";
return 0;
}
输出
0 1 2 3 4 5 6 7 8 9
由于数组名直接相当于“首地址”的含义,故一般的传入首地址可以直接写数组名,尾地址可以写数组名+排序长度
sort(t,t+10);
如果我一定要让它从大到小,那就干脆反向输出就需要用到cmp这个参数:
bool cmp(int a,int b){
return a>b; //从大到小——大于返回true,小于返回false
}
int main()
{
int t[10]={3,4,2,1,8,7,5,6,9,0};
sort(t,t+10,cmp);
for(int i=0;i<10;i++)cout<<t[i]<<" ";
return 0;
}
输出:
9 8 7 6 5 4 3 2 1 0
当然,sort的功能远不止此,它更广阔的施展空间在于与类/结构体搭配使用,后文以结构体为例
sort与结构体——cmp的应用
sort函数的灵魂就在于第三个参数:比较规则函数cmp上。
若想实现结构体对象的排序,因为无法直观的判断它的“大小”,所以没法按照默认的从小到大进行排序
比如我现在有两门考试:高数和大物,用结构体存储10个人的分数(都整数),要求按照总分大小排序,总分一样的按照高数成绩从大到小排序:
输入
99 97
100 100
90 90
89 93
88 95
80 100
100 80
90 92
91 91
87 94
输出
100 100
99 97
88 95
91 91 //总分一样按照高数排序,总分182,高数91
90 92 //总分一样按照高数排序,总分182,高数90
89 93 //总分一样按照高数排序,总分182,高数989
87 94
100 80
90 90
80 100
sort与结构体——运算符<
重载
由于sort
函数的默认排序规则是从小到大,而普通的结构体并没有自带的大小规定。所以我们如果能重载<
运算符,为它人为规定一个大小,就可以使用默认的排序规则进行排序
struct student{
int mat,pht;
}stu[10];
//运算符重载应该还没忘吧
bool operator < (const student& a,const student& b){
if(a.mat+a.pht==b.mat+b.pht)//如果总分一样,优先比较高数
return a.mat<b.mat;
return a.mat+a.pht<b.mat+b.pht;//比较总分
}
int main()
{
for(int i=0;i<10;i++)
cin>>stu[i].mat>>stu[i].pht;
sort(stu,stu+10);
for(int i=9;i>=0;i--)//倒叙输出,这样就看上去是从大到小了
cout<<stu[i].mat<<" "<<stu[i].pht<<endl;
return 0;
}
输入:(同上一题)
99 97
100 100
90 90
89 93
88 95
80 100
100 80
90 92
91 91
87 94
输出:(同上一题)
100 100
99 97
88 95
91 91 //总分一样按照高数排序,总分182,高数91
90 92 //总分一样按照高数排序,总分182,高数90
89 93 //总分一样按照高数排序,总分182,高数989
87 94
100 80
90 90
80 100
案例设计的可以自己输入数据,建议读者按上面的思路自己写一遍,然后自己输入几个数据试一下。