今天看了很多关于快排的文章,果然对我这个新人来说调用sort和qsort才是王道啊。
首先是当然是头文件的区别了:
qsort:
#include<stdlib.h>
sort:
#include<algorithm>
using namespace std;
qsort是c里的,sort是c++里的,头文件自然不一样。
之后是调用的格式,对于qsort,它需要4个参数:
qsort(排序首地址,排序长度,排序元素长度,cmp)
而sort只需要2个或3个参数:
sort(排序首地址,排序尾地址,cmp)(2个参数就是不写cmp,这样默认是升序排列)
最后重点就是关于cmp的写法:
qsort:(以整型为例, 字符串要用strcmp,都是升序)
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *) b;// 因为返回值类型为int 所以仅限于整型
}
结构体一级排序:
int cmp(const void *a, const void *b)
{
Date *c = (Date *)a;
Date *d = (Date *)b;
return c -> mon - d -> mon;
}
结构体二级排序:
int cmp(const void *a, const void *b)
{
Date *c = (Date *)a;
Date *d = (Date *)b;
if(c -> mon != d -> mon)
return c -> mon - d -> mon;
return c -> day - d -> day;
}
但是对于float或double类型,如果是a - b 返回值就不是整型,在排序时会出错。所以要写成a > b? 1 : -1;的类型。
sort:(以整型为例, 字符串要用strcmp,都是升序(默认为升序))
bool cmp(const int &a, const int &b)//cmp(const 变量类型 &a, const 变量类型 &b)
{
return a < b;
}
结构体一级排序:
bool cmp(const Date &a, const Date &b)
{
return a.mon < b.mon;
}
结构体二级排序:
bool cmp(const Date &a, const Date &b)
{
if(a.mon != b.mon)
return a.mon < b.mon;
return a.day < b.day;
}
对于结构体也可以利用重载运算符。
struct Road
{
int a, b, l;
bool operator < (const Road &i)const
{
return l < i.l;
}
}road[S];
C++中的sort是C中qsort的优化。