一、用sort对基本类型的数组从小到大或从大到小排序
sort(数组名+n1,数组名+n2);注意排序区间是[n1,n2),左闭右开。默认为从小到大排序,如果想要从大到小排序,需要加参数sort(数组名+n1,数组名+n2,greater<int>());
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[5]={5,4,2,1,3};
sort(a,a+5);
for(int i=0;i<5;i++){
cout<<a[i]<<" "; //输出为1 2 3 4 5
}
cout<<endl;
sort(a,a+5,greater<int>());
for(int i=0;i<5;i++){
cout<<a[i]<<" "; //输出为5 4 3 2 1
}
return 0;
}
二、用自定义的规则,对任何类型T的数组排序
形式为sort(数组名+n1,数组名+n2,排序规则结构名());
排序规则结构的定义方式:
struct 结构名
{
bool operator()(const T & a1,const T & a2){
//若a1应该在a2前面,则返回true
//否则返回false
}
}
#include<iostream>
#include<algorithm>
using namespace std;
struct Rule1 //按个位数从小到大排序
{
bool operator()(const int & a1,const int & a2){
return a1%10>a2%10;
}
};
int main(){
int a[5]={25,34,42,61,73};
sort(a,a+5,Rule1());
for(int i=0;i<5;i++){
cout<<a[i]<<" "; //输出为25 34 73 42 61
}
return 0;
}
当然功能不至于对int型数组进行排序,我们可以对任何类型的数据添加自定义规则进行排序,例如下面对student进行自定义规则排序。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class Student{
public:
int age;
string name;
Student(int a,string n){
age=a;
name=n;
}
};
struct studentRule1 //按学生年龄从小到大排序
{
bool operator()(const Student & a1,const Student & a2){
return a1.age<a2.age;
}
};
struct studentRule2 //按学生姓名字典序排列
{
bool operator()(const Student & a1,const Student & a2){
return a1.name.compare(a2.name)<0;
}
};
int main(){
Student s1(20,"tony");Student s2(22,"baby");Student s3(21,"andy");
Student s[3]={s1,s2,s3};
sort(s,s+3,studentRule1());
for(int i=0;i<3;i++){
cout<<s[i].age<<" "; //输出为 20 21 22
}
sort(s,s+3,studentRule2());
for(int i=0;i<3;i++){
cout<<s[i].name<<" "; //输出为 andy baby tony
}
return 0;
}
三、sort应用于vector等顺序容器
sort不只可以应用于数组,也可以应用在stl中的vector等容器上,非常的好用,这里敲了一个简单的例子。
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
vector<string> fruit;
fruit.push_back("banana");fruit.push_back("apple");fruit.push_back("orange");
vector<string>::iterator i;
sort(fruit.begin(),fruit.end());
for(i=fruit.begin();i!=fruit.end();i++){
cout<<*i<<" "; //输出为 apple banana orange
}
cout<<endl;
return 0;
}
总结
掌握并灵活运用好sort对于我们做项目或者参加算法竞赛有非常大的帮助,毕竟重复发明轮子又耗时又低效,我们可以直接运用封装好的sort,把自己的精力更多的集中于业务逻辑上。