C++是sort函数
C是qsort(有指数)
sort在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n^2)的问题
首先,头文件
#include<algorithm>
using namespace std;
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填))
可以看到,sort的参数有三个,其中前两个是必填的,而比较函数则可以根据需要填写
如果不写比较函数,则默认对前面给出的区间进行递增排序
如果需要对序列进行排序,那么序列中的元素一定要有可比性,因此需要制定排序规则来建立这种可比性。
特别是像结构体,本身并没有大小关系,需要人为制定比较的规则。sort的第三个可选参数就是compare函数(一般
写作cmp函数),来实现这个规则
TIPS:
1、如何实现比较函数cmp
下面介绍对基本数据类型、结构体类型、STL容器进行自定义规则排序时cmp的写法:
①基本数据类型的排序
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;//可以理解为当a>b时把a放在前面
}
int main()
{
int a[]={3,1,4,2};
sort(a,a+4,cmp);
for(int i=0;i<4;i++)
{
printf("%d ",a[i]);
}
return 0;
}
同理double类型、char类型也相同
所以如果要把数据从小到大排列,那么就用"<",因为"a<b"
(可以先试一试)
②结构体数组的排序
struct node{
int x,y;
}ssd[10];
bool cmp(node a,node b)
{
return a.x>b.x;
}
那么先按x从大到小,如果相等的话,就按照y的从小到大顺序
bool cmp(node a,node b)
{
if(a.x!=b.x)
return a.x>b.x;
else
return a.y<b.y;
}
③容器的排序
在STL标准容器中,只有vetor、string、deque是可以sort的。这是因为像set、
map这种容器是用红黑树实现的,元素本身有序,故不使用sort排序
知识点来自于《算法笔记》