顾名思义,sort()就是用来排序的函数,它根据具体情形使用不同的排序方法,效率较高。一般来说,不推荐使用C语言中的qsort()函数,原因是qsort()用起来比烦琐,涉及很多指针的操作。而且sort()在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n^2)的极端情况。希望读者能通过这篇介绍来轻松愉快地使用sort函数。
1.如何使用sort()排序
sort()函数的使用必须加上头文件“#include<algorithm>”和“using namespace std;",其使用的方式如下:
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填);
可以看到,sort()的参数有三个,其中前两个是必填的,而比较函数则可以根据需要填写,如果不写比较函数,则默认对前面给出的区间进行递增排序。
(1)int类型:
程序代码:
using namespace std;
int main(){
int a[6] = {9,4,2,5,6,-1};
//将a[0]~a[3]从小到大排序
sort(a,a+4);
for(int i=0;i<6;i++) {
printf("%d ",a[i]);
}
printf("\n");
//将a[0]~a[5]从小到大排序
sort(a,a+6);
for(int i=0;i<6;i++) {
printf("%d ",a[i]);
}
return 0;
}
运行结果:
(2)double类型:
程序代码:
using namespace std;
int main(){
double a[] = {1.2,3.4,-2.1,9};
sort(a,a+4);
for(int i=0;i<4;i++) {
printf("%3.1lf ",a[i]);
}
return 0;
}
运行结果:
(3)char类型:
程序代码:
using namespace std;
int main(){
char a[] = {'T','W','A','K'};
sort(a,a+4);
for(int i=0;i<4;i++) {
printf("%c ",a[i]);
}
return 0;
}
运行结果:
2.如何实现比较函数cmp
(1)基本数据类型数组的排序
若比较函数不填,则默认按照从小到大的顺序排序。
使用比较函数cmp来告诉sort()函数还是要交换元素(让元素的大小比较关系反过来)。
①int类型:
程序代码:
#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp(int a, int b){
return a>b;//可以理解为当a>b时把a放在b前面
}
int main(){
int a[6] = {9,4,2,5,6,-1};
//将a[0]~a[3]从小到大排序
sort(a,a+6,cmp);
for(int i=0;i<6;i++) {
printf("%d ",a[i]);
}
return 0;
}
运行结果:
②double类型:
程序代码:
using namespace std;
bool cmp(double a, double b){
return a>b;//可以理解为当a>b时把a放在b前面
}
int main(){
double a[] = {1.2,3.4,-2.1,9};
sort(a,a+4,cmp);
for(int i=0;i<4;i++) {
printf("%3.1lf ",a[i]);
}
return 0;
}
运行结果:
③char类型:
程序代码:
using namespace std;
bool cmp(char a, char b){
return a>b;//可以理解为当a>b时把a放在b前面
}
int main(){
char a[] = {'T','W','A','K'};
sort(a,a+4,cmp);
for(int i=0;i<4;i++) {
printf("%c ",a[i]);
}
return 0;
}
运行结果:
(2)结构体数组的排序
现在定义了如下的结构体:
struct node {
int x,y;
}ssd[10];
程序代码:
using namespace std;
struct node {
int x,y;
}ssd[10];
bool cmp(node a, node b){
return a.x>b.x;//可以理解为当a>b时把a放在b前面
}
int main(){
ssd[0].x = 2;
ssd[0].y = 2; //{2,2}
ssd[1].x = 1;
ssd[1].y = 3; //{1,3}
ssd[2].x = 3;
ssd[2].y = 1; //{3,1}
sort(ssd,ssd+3,cmp);
for(int i=0;i<3;i++) {
printf("%d %d\n",ssd[i].x,ssd[i].y);
}
return 0;
}
运行结果:
而如果想要先按x从大到小排序,但x相等的情况下,按照y来从小到大排序。
bool cmp(node a, node b){
if(a.x!=b.x) return a.x>b.x;//x不相等时按x从大到小排序
return a.y<b.y; //x相等时按y从小到大排序
}
程序代码:
using namespace std;
struct node {
int x,y;
}ssd[10];
bool cmp(node a, node b){
if(a.x!=b.x) return a.x>b.x;//x不相等时按x从大到小排序
return a.y<b.y; //x相等时按y从小到大排序
}
int main(){
ssd[0].x = 2;
ssd[0].y = 2; //{2,2}
ssd[1].x = 1;
ssd[1].y = 3; //{1,3}
ssd[2].x = 2;
ssd[2].y = 1; //{2,1}
sort(ssd,ssd+3,cmp);
for(int i=0;i<3;i++) {
printf("%d %d\n",ssd[i].x,ssd[i].y);
}
return 0;
}
运行结果:
(3)容器的排序
在STL标准容器中,只有 vector、 string、 qeque 是可以使用sort的。这是因为像set、map这种容器是用红黑树实现的(了解即可),元素本身有序,故不允许使用sort排序。
①vector()
程序代码:
using namespace std;
bool cmp(int a, int b){
return a>b;
}
int main(){
vector<int> vi;
vi.push_back(3);
vi.push_back(1);
vi.push_back(2);
sort(vi.begin(),vi.end(),cmp);
for(int i=0;i<3;i++) {
printf("%d ",vi[i]);
}
return 0;
}
运行结果:
②string
- 默认按照字典序从小到大排序
程序代码:
using namespace std;
int main(){
string str[3] = {"bbbb","cc","aaa"} ;
sort(str,str+3);
for(int i=0;i<3;i++) {
cout<<str[i]<<endl;
}
return 0;
}
运行结果:
- 按照字符串长度从小到大排序
程序代码:
using namespace std;
bool cmp(string str1,string str2) {
return str1.length() < str2.length();
}
int main(){
string str[3] = {"bb","cccc","aaa"} ;
sort(str,str+3,cmp);
for(int i=0;i<3;i++) {
cout<<str[i]<<endl;
}
return 0;
}
运行结果: