Bootstrap

C++ sort()排序详解

头文件

        c++中使用sort()函数需要使用#include<algorithm>头文件。algorithm意为“算法”,是c++的标准模板库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数。

基本使用方法

        sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp),其中begin为指向待sort()的数组的第一个元素的指针end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,如果不写的话,默认从小到大进行排序。如果我们想从大到小排序可以将cmp参数写为greater<int>()就是对int数组进行排序,当然<>中我们也可以写double、long、float等等。如果我们需要按照其他的排序准则,那么就需要我们自己定义一个bool类型的函数来传入。比如我们对一个整型数组进行从小到大排序:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int num[5]={2,3,0,4,1};
    sort(num,num+5);//不写cmp默认从小到大排序
    for(int i=0;i<5;i++){
        cout<<num[i];
    }
}
//输出结果为01234

如果从大到小:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int num[5]={2,3,0,4,1};
    sort(num,num+5,greater<int>());
    for(int i=0;i<5;i++){
        cout<<num[i];
    }
}
//输出结果为43210

自定义排序准则

如果我们不想从小到大或者是从大到小排序,那么我们可以自定义。如下

bool cmp(int x,int y){
	return x % 10 > y % 10;
}

这个意思是,我们按照每个数的个位进行从大到小排序。

然后我们将这个cmp函数作为参数传入sort()中即可实现了上述排序需求。

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
    return x%10>y%10;
}
int main(){
    int num[5]={2,3,0,4,1};
    sort(num,num+5,cmp);
    for(int i=0;i<5;i++){
        cout<<num[i];
    }
}
//输出结果为43210

另外,  greater<int>() 【当然此时的int也可换做double,long long 之类的。】也相当于:

bool cmp(long long x,long long y){
	return x>y;
}

(作者做题时候发现明明 greater<int>()就搞定了,结果又多写了个上面的代码...悲) 

对结构体进行排序

sort()也可以对结构体进行排序,比如我们定义一个结构体含有学生的姓名和成绩的结构体Student,然后我们按照每个学生的成绩从高到底进行排序。首先我们将结构体定义为:

struct Student{
	string name;
	int score;
	Student() {}
	Student(string n,int s):name(n),score(s) {}
};

根据排序要求我们可以将排序准则函数写为:

bool cmp_score(Student x,Student y){
	return x.score > y.score;
}

全部代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

struct Student{
	string name;
	int score;
	Student() {}
	Student(string n,int s):name(n),score(s) {}
};

bool cmp_score(Student x,Student y){
	return x.score > y.score;
}

int main(){
	Student stu[3];
	string n;
	int s;
	for(int i=0;i<3;i++){
		cin>>n>>s;
		stu[i] = Student(n,s);
	}
	
	sort(stu,stu+3,cmp_score);
	
	for(int i=0;i<3;i++){
		cout<<stu[i].name<<" "<<stu[i].score<<endl;
	}
	
	return 0;
}

希望能帮助你认识sort()排序!

;