c++ sort函数使用详细指南

转自: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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值