本文对算法竞赛中常用到的两个排序函数qsort和sort的使用方法做出一些总结,重点关注它们使用时排序规则的定义。
1、qsort
函数原型:
void __cdecl qsort (
void *base,
size_t num,
size_t width,
int (__cdecl *comp)(const void *, const void *)
)
函数包含在头文件
base: 排序起始地址
num: 排序元素数量
width: 单个元素大小
comp; 排序规则,用来比较两个元素大小的函数指针
下面讨论排序规则comp函数的写法,常写成cmp,默认升序排列:
一、对int类型排序
int num[MaxSize];
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
qsort(num, n, sizeof(num[0]), cmp);
二、对double类型排序
double num[100];
int cmp(const void *a, const void *b)
{
return *(double *)a > *(double *)b ? 1 : -1;//这里注意,浮点数是不能用等号来判断相等的
}
qsort(num, n, sizeof(num[0]), cmp);
三、对char类型排序
char num[100];
int cmp(const void *a, const void *b)
{
return *(char *)a - *(char *)b;
}
qsort(num, n, sizeof(num[0]), cmp);
四、对结构体一级排序
struct Node
{
int x;
int y;
}num[100];
int cmp(const void *a, const void *b)//按x排序
{
struct Node *c = (Node *)a;
struct Node *d = (Node *)b;
return c->x - d->x;
}
qsort(num, n, sizeof(num[0]), cmp);
五、对结构体二级排序
struct Node
{
int x;
int y;
}num[100];
int cmp(const void *a, const void *b)//按x排序,x相等时按y排序
{
struct Node *c = (Node *)a;
struct Node *d = (Node *)b;
if (c->x != d->x)
return c->x - d->x;
return c->y - d->y;
}
qsort(num, n, sizeof(num[0]), cmp);
六、对结构体数组排序(按照结构体中str的字典序排序)
struct Array
{
char str[100];
}num[100];
int cmp(const void *a, const void *b)
{
struct Array *c = (Node *)a;
struct Array *d = (Node *)b;
return strcmp(c->str, d->str);
}
qsort(num, n, sizeof(num[0]), cmp);
2、sort
函数原型:
template
void sort ( RandomAccessIterator first, RandomAccessIterator last );
template
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
函数包含在头文件
一、传递两个参数,默认升序排序
//对数组num的前n个元素排序
int num[MaxSize];
sort(num, num+n);//这里是num+n,也就是对num[0]到num[n-1]排序
二、有时候需要降序排序,这时候需要定义排序规则,作为第三个参数,同样用cmp来表示
bool cmp(int a, int b)
{
return a > b;
}
//对数组num的前n个元素降序排序
int num[MaxSize];
sort(num, num+n, cmp);
一般情况下,如果能够使用sort解决问题,总是会优先使用sort函数,因为它用起来更简单。