顾名思义,sort就是用来排序的函数,它根据具体的情形使用不同的排序办法,效率较高。

1.如何使用sort排序

​ sort函数的使用必须加上头文件“#include ”和 “using namespace std;”

具体使用方式如下:

sort(a,b,c);

其中a为:首元素地址,必填内容

b为:尾元素地址的下一个地址,必填内容

c为:比较函数(也即比较规则),非必填内容

a,b为必填内容,c根据实际情况填写,非必填,如果不填比较函数,则默认对给出的区间进行升序排序(字符串为字典序)

1.1对整型数组排序:

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

int main(){
  int a[6] = {9, 4, 2, 5, 6, -1};
  cout << "排序前:";
  for(int i = 0;i < 6;i ++) cout << a[i] << " ";
  cout << endl;
    
  sort(a + 0, a+4);  //对a[0]~a[3]升序排序(从小到大)
  cout << "第一次排序:";
  for(int i = 0;i < 6;i ++) cout << a[i] << " ";
  cout << endl;

  sort(a, a+6);  //对a[0]~a[5]升序排序(从小到大)
  cout << "第二次排序:";
  for(int i = 0;i < 6;i ++) cout << a[i] << " ";

  return 0;
}

运行结果如下:

排序前:9 4 2 5 6 -1 
第一次排序:2 4 5 9 6 -1 
第二次排序:-1 2 4 5 6 9 

1.2对浮点型数组排序:

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

int main(){
  double a[] = {1.1, -1,1, 2.5, -3.3, 5.5, 1.6};
  cout << "排序前:";
  for(int i = 0;i < 6;i ++) cout << a[i] << " ";
  cout << endl;
    
  sort(a, a+6);  //对a[0]~a[5]升序排序(从小到大)
  cout << "排序后:";
  for(int i = 0;i < 6;i ++) cout << a[i] << " ";
  cout << endl;
    
  return 0;
}

运行结果如下:

排序前:1.1 -1 1 2.5 -3.3 5.5 
排序后:-3.3 -1 1 1.1 2.5 5.5 

1.3对字符串(字符数组)排序:

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

int main(){
  char a[] = {'I', 'L', 'O', 'V', 'E', 'U'};
  cout << "排序前:";
  for(int i = 0;i < 6;i ++) cout << a[i];
  cout << endl;
    
  sort(a, a+6);  //对a[0]~a[5]按照字典序排序
  cout << "排序后:";
  for(int i = 0;i < 6;i ++) cout << a[i];
  cout << endl;
    
  return 0;
}

运行结果如下:

排序前:ILOVEU
排序后:EILOUV

2.如何实现比较函数cmp

​ 下面介绍对于基本数据类型,结构体类型,进行自定义排序cmp的写法

具体方式如下:

2.1基本数据类型数组的排序:

​ 若比较函数不填,默认升序(或者字典序)排序,下面对int数组的排序;

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

int main(){
    int a[] = {3, 5, 2, 1, 4};
    cout << "排序前:";
    for(int i = 0;i < 5;i ++)  cout << a[i] << " ";
    cout << endl;
    
    sort(a, a+5);
    cout << "排序后:";
    for(int i = 0;i < 5;i ++)  cout << a[i] << " ";
    
    return 0;
}

运行结果如下:

排序前:3 5 2 1 4 
排序后:1 2 3 4 5 

如果想要降序排序,那么我们就要用到cmp函数“告诉”sort何时交换元素,代码写法如下:

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

bool cmp(int a, int b){
    return a > b; //可以理解为a > b时 就把a放前面
}

int main(){
    int a[] = {3, 5, 2, 1, 4};
    cout << "排序前:";
    for(int i = 0;i < 5;i ++)  cout << a[i] << " ";
    cout << endl;
    
    sort(a, a+5, cmp);
    cout << "排序后:";
    for(int i = 0;i < 5;i ++)  cout << a[i] << " ";
    
    return 0;
}

运行结果如下:

排序前:3 5 2 1 4 
排序后:5 4 3 2 1 

​ 这样就可以让数值大的元素在前面,即降序排序,对于double,char亦如此,把cmp内传入的参数类型改一下就好了

2.2结构体数组的排序

现在定义了如下的结构体:

struct node{
    int x, y;
}ssd[10];

如果想要ssd数组按照x从大到小排序,可以这样写cmp函数:

bool cmp(node a, node b){
	return a.x > b.x;    
}

完整示例:

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

struct node{
    int x, y;
}ssd[10];

bool cmp(node a, node b){
    return a.x > b.x; //按照x降序排列 
}

int main(){
	ssd[0].x=2; //{2,2} 
	ssd[0].y=2;
	ssd[1].x=1; //{1,3}
	ssd[1].y=3;
	ssd[2].x=3; //{3,1}
	ssd[2].y=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 1
2 2
1 3

如果想要先按照x降序,x相等时,y升序排列(二级排序),那么代码实现如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
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降序排列 
	else return a.y < b.y; //按照y升序排列 
}

int main(){
	ssd[0].x=2; //{2,2} 
	ssd[0].y=2;
	ssd[1].x=1; //{1,3}
	ssd[1].y=3;
	ssd[2].x=2; //{2,1}
	ssd[2].y=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;
}

运行结果如下:

2 1
2 2
1 3