转自:https://blog.csdn.net/OpenStack_/article/details/88371505
标准模板库STL中的sort()函数,时间复杂度为n*log2(n),执行效率较高。
用法
①、sort()函数可以三个参数也可以两个参数;
②、必须的头文件 #include < algorithm>和using namespace std。
③、它使用的排序方法类似于快排,时间复杂度为n*log2(n)
sort()函数有三个参数:(第三个参数可不写)
(1)第一个是要排序的数组的起始地址。
(2)第二个是最后一位要排序的元素的下一位的地址。
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
sort函数,左闭右开,即 int a[10]={2,4,1,23,5,76,0,43,24,65}。 sort(a,a+10)。
两个参数时
#include<iostream>
#include <algorithm>
using namespace std;
int main(){
int a[10]={2,4,1,23,5,76,0,43,24,65};
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
sort(a,a+10); //STL中sort函数
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
return 0;
}
输出结果是升序排列。(两个参数的sort默认升序排序)
三个参数时
①、加入一个比较函数 complare():
#include<iostream>
#include <algorithm>
using namespace std;
bool complare(int a,int b){
return a>b;
}
int main(){
int a[10]={2,4,1,23,5,76,0,43,24,65};
//打印原数组
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
//排序
sort(a,a+10,complare);
//打印排序后的数组
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
return 0;
}
②、使用 less<数据类型>(),或 greater<数据类型>():
less<数据类型>()//从小到大排序
greater<数据类型>()//从大到小排序
#include<iostream>
#include <algorithm>
using namespace std;
int main(){
int a[10]={2,4,1,23,5,76,0,43,24,65};
//打印原数组
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
//排序
sort(a,a+10,greater<int>());
//打印排序后的数组
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
return 0;
}
③、对向量vector排序:
1、使用 sort(vec.begin(),vec.end())排序;
2、使用sort(vec.begin(),vec.end(),greater())排序。
vector vec(arr,arr+10); // 用数组元素初始化vector容器,左闭右开,即+元素数量 。
sort(vec.begin(),vec.end(),greater()); // <>里面只需装容器所容纳的元素的类型
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int arr[10]={5,6,1,9,3,7,3,1,0,8};
//vector容器存放arr数组中的元素
vector<int> vec(arr,arr+10); //经典!用数组元素初始化vector容器,左闭右开,即+元素数量
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<" ";
}
cout<<endl;
//使用默认排序方法:
sort(vec.begin(),vec.end());
cout<<"使用默认排序方法: ";
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<" ";
}
cout<<endl;
//使用greater<>()规则:
sort(vec.begin(),vec.end(),greater<int>()); //这就很神奇了!!!
cout<<"使用greater<>()规则: ";
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<" ";
}
return 0;
}
③、对字符数组进行排序:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
char arr[11]="asdfghjklk";
sort(arr,arr+10,greater<char>());
for(int i=0;i<10;i++){
cout<<arr[i]<<" ";
}
return 0;
}
④、对字符串排序:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
string arr="asdfghjklk";
sort(arr.begin(),arr.end(),less<char>());
for(int i=0;i<10;i++){
cout<<arr[i]<<" ";
}
return 0;
}
⑤、 对结构体排序:
1、自定义规则;
2、运算符重载。
1.自定义规则
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
string name;
int age;
};
//自己定义的规则:按姓名从小到大排列,若姓名一样,按年龄从小到大排列
bool comp(student s1,student s2){
if(s1.name==s2.name){
return s1.age<s2.age;
}
else{
return s1.name<s2.name;
}
}
int main(){
student s[100];
s[0].name="zhangsan";s[0].age=19;
s[1].name="zhangsan";s[1].age=18;
s[2].name="lisi";s[2].age=20;
sort(s,s+3,comp);//左闭右开,所以是对s[0]到s[2]排序
for(int i=0;i<3;i++){
cout<<s[i].name<<" "<<s[i].age<<endl;
}
return 0;
}
2.重载运算符
bool operator < (const student &s) const
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
string name;
int age;
bool operator < (const student &s)const{//符号重载
if(name==s.name){
return age<s.age;
}
else{
return name<s.name;
}
}
};
int main(){
student s[100];
s[0].name="zhangsan";s[0].age=19;
s[1].name="zhangsan";s[1].age=18;
s[2].name="lisi";s[2].age=20;
sort(s,s+3);//左闭右开,所以是对s[0]到s[2]排序
for(int i=0;i<3;i++){
cout<<s[i].name<<" "<<s[i].age<<endl;
}
return 0;
}
string 使用反向迭代器来完成逆序排列
#include <iostream>
using namespace std;
int main()
{
string str("cvicses"); //用()对字符串赋值
string s(str.rbegin(),str.rend()); //反向迭代器,将字符串str翻转,赋值给字符串s
cout << s <<endl; //打印字符串s
return 0;
}