常用排序之qsort和sort

来源:互联网 发布:在淘宝上赌徒跳刀 编辑:程序博客网 时间:2024/05/21 09:05

本文对算法竞赛中常用到的两个排序函数qsort和sort的使用方法做出一些总结,重点关注它们使用时排序规则的定义。


1、qsort

函数原型:

void __cdecl qsort (      void *base,      size_t num,      size_t width,      int (__cdecl *comp)(const void *, const void *)      )

函数包含在头文件<stdlib.h>中,参数解释如下:
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 <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last );template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

函数包含在头文件<algorithm>中,可以看出,sort函数可以传递两个或三个参数,第一个参数为排序的起始地址,第二个参数为排序的终止地址,第三个参数为排序规则:

一、传递两个参数,默认升序排序

//对数组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函数,因为它用起来更简单。



1 0
原创粉丝点击