sort函数用法简介
排序算法为竞赛中最常用的算法之一,我们可以利用 C++自带的库函数进行排序。
头文件&函数调用格式
使用排序算法必须包含 #include<algorithm> 头文件
自带排序算法的一般形式为:【排序区间,左闭右开,即取左不取右】
sort(arr+m,arr+n); //将数组 arr 的下标为 m 的元素到下标为 n-1 的元素进行从小到大排序。
sort(arr+m,arr+n,cmp); //与 sort(arr+m,arr+n)相比,这个写法可以自己定义排序的规则
//其中,cmp 为自定义的函数
如果对数组A下标为[1,12]的范围排序,调用的函数形式应该为:
sort(A+1,A+13);
sort(A+1,A+13,cmp);
从小到大排序
sort函数如果不便用比较函数,默认从小到大排序。
例.从键盘读入 10 个数,然后从小到大输出的功能
#include<iostream>
using namespace std;
int a[10];
int main()
{
for (int i=0;i<10;++i) cin>>a[i];
sort(a+0,a+10);
for (int i=0;i<10;++i)
cout<<endl;
return 0;
}
从大到小排序 从大到小的进行排序。那么我们可以用 sort(arr+n,arr+m,cmp)进行排序。 不过,在调用 sort(arr+n,arr+m,cmp) 之前我们需要自己写个 cmp 函数。
//cmp 函数的名字compare的缩写
bool my_cmp(int x,int y)
{
return x>y; //默认比较函数体内容为:x<y
}
例.程序实现从键盘读入 10 个数,然后从大到小输出的功能。
#include<iostream>
using namespace std;
int a[10];
bool cmp(int x,int y){
return x>y; //从大到小排列;默认是 x<y 为真
}
int main()
{
for (int i=0;i<10;++i) cin>>a[i];
sort(a+0,a+10,cmp);
for (int i=0;i<10;++i)
cout<<endl;
return 0;
}
有多个排序规则
在更多情况下,我们不仅对一个特征进行排序,而是多个特征。
例如将学生的成绩进行排序,当然 用上面的做法是行不通的。 这时,我们就想到了结构体这种数据类型。
当我们采用 sort()函数的默认规则排 序结构体时,sort()默认结构体中的第一个成员为第一关键字,第二个成员为第二关键字,……,第 N 个元 素为第 N 关键字,然后从小到大排序。
例.我们要将学生的成绩从大到小排序,当成绩相同时,根据姓名字典序小的优先的规则排进行序。
显然我们无法采用默认规则进行排序。
这时我们可以定义这样的 cmp: 对结构体数组排序,比较函数传参时数据类型应当为结构体类型。
struct STU{
float score;
char name[10];
};
bool StuCmp( STU a, STU b)
{
if (a.score!=b.score) return a.score>b.score; //成绩不相等时,比较成绩
else{//否则(隐含成绩相等)比较姓名字典序
if (strcmp(a.name,b.name)<0) return 1; //strcmp( )函数有三种结果,前面小时直接判断为真,不可以简写
return 0; //包含大于为正时,和相等为0时
}
}
浙公网安备 33010602011771号