1. sort函数是用来排序的函数,它是根据具体的情况使用不同的排序方法,效率较高,一般来说,不推荐使用C语言中的qsort函数,原因是qsort函数使用起来比较麻烦,涉及到很多指针的操作,而且在sort函数在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n ^ 2)的极端情况,所以我们在排序的时候尽量使用C++下的sort函数来进行排序
2. 下面是sort函数的常见用法:
① 如何使用sort函数
sort函数的使用需要加上头文件#include
sort(首元素地址,尾元素的下一个地址,比较函数);
其中sort函数的参数中前面两个参数是必填的,第三个参数是可以根据需要来进行填写的,,如果不写比较函数那么则默认对于前面给出的区间进行递增排序,下面是具体的例子:
#include
#include
using namespace std;
int main(void){
int arr[6] = {9, 4, 2, 5, 6, -1};
//对a[0]到a[4]进行排序
sort(arr, arr + 5);
for(int i = 0; i < 6; ++i){
printf("%d ", arr[i]);
}
printf("\n");
//将a[0]到a[5]从小到大进行排序
sort(arr, arr + 6);
for(int i = 0; i < 6; ++i){
printf("%d ", arr[i]);
}
return 0;
}
② 对double数组进行排序,具体的代码如下:
#include
#include
using namespace std;
int main(void){
double arr[] = {1.4, -2.1, 9, 3.5};
sort(arr, arr + 4);
for(int i = 0; i < 4; ++i){
printf("%.1f ", arr[i]);
}
return 0;
}
③ 对char数组进行排序,默认排序为字典序
#include
#include
using namespace std;
int main(void){
char c[] = {'C', 'T', 'W', 'R', 'R'};
sort(c, c + 5);
for(int i = 0; i < 5; ++i){
printf("%c ", c[i]);
}
return 0;
}
④ 除了上面的基本数据类型进行排序之外,sort函数还可以对非基本数据类型进行排序,比如是结构体这些我们需要自己制定比较规则的函数,然后将函数名作为参数传到sort函数中,下面是介绍对基本数据类型、结构体类型、STL容器进行自定义排序时cmp函数的写法:
1)基本数据类型的排序
如果比较函数不填,那么默认是从小到大的顺序来排序,下面是对int数组的排序,如果需要从大到小进行排序那么需要使用cmp比较函数来告诉sort什么时候要交换元素,下面实现数组中从大到小进行排序:
#include
#include
using namespace std;
//自定义比较规则
bool cmp(int a, int b){
return a > b;
}
int main(void){
int arr[] = {3, 1, 4, 2};
sort(arr, arr + 4, cmp);
for(int i = 0; i < 4; ++i){
printf("%d ", arr[i]);
}
return 0;
}
2)对double数组进行从大到小进行排序:
#include
#include
using namespace std;
double cmp(double a, double b){
return a > b;
}
int main(void){
double arr[] = {1.4, -2.1, 9, 3.5};
sort(arr, arr + 4, cmp);
for(int i = 0; i < 4; ++i){
printf("%.1f ", arr[i]);
}
return 0;
}
3)对cha数组从大到小进行排序:
#include
#include
using namespace std;
//自定义比较规则
bool cmp(char a, char b){
return a > b;
}
int main(void){
char c[] = {'C', 'T', 'W', 'R', 'R'};
sort(c, c + 5, cmp);
for(int i = 0; i < 5; ++i){
printf("%c ", c[i]);
}
return 0;
}
4)对结构体数组进行排序,下面的例子中当x相等的情况下按照x的大小来进行排序,当x不相等的情况下,按照y的大小从小到大进行排序,下面是具体的代码:
#include
#include
using namespace std;
struct node{
int x, y;
}Node[10];
int cmp(node a, node b){
//x不相等的时候x按照从小到大进行排序
if(a.x != b.x) return a.x > b.x;
//x相等的时候按照y从小到大进行排序
else return b.y < b.y;
}
int main(void){
Node[0].x = 2;
Node[0].y = 2;
Node[1].x = 1;
Node[1].y = 3;
Node[2].x = 2;
Node[2].y = 1;
sort(Node, Node + 3, cmp);
for(int i = 0; i < 3; ++i){
printf("%d %d\n", Node[i].x, Node[i].y);
}
return 0;
}
5)对vector进行排序:
在stl标准容器中,只有vector、string、deque是可以使用sort的,这是因为像set和map这种容器是使用红黑树来进行实现的,元素本身就是有序的,所以不允许使用sort来进行排序,下面是第vector进行排序:
#include
#include
#include
using namespace std;
bool cmp(int a, int b){
//从大到小进行排序
return a > b;
}
int main(void){
vector vec;
vec.push_back(3);
vec.push_back(1);
vec.push_back(4);
vec.push_back(7);
vec.push_back(2);
sort(vec.begin(), vec.end(), cmp);
for(int i = 0; i < vec.size(); ++i){
printf("%d ", vec[i]);
}
return 0;
}
2)对string进行排序,具体代码如下:
#include
#include
#include
#include
#include
using namespace std;
int main(void){
string str[] = {"bbbbb", "cccsa", "auwuqu"};
sort(str, str + 3);
for(int i = 0; i < 3; ++i){
cout << str[i] << endl;
}
return 0;
}