C/C++中的qsort()函数及其cmp()
功 能: 使用快速排序例程进行排序
头文件:stdlib.h
函数原型:
从上例可以看出,编写cmp函数是使用qsort()快排的最重要部分, 也是难点。
本例选自九度OJ 1061: 成绩排序。
有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void *) )参数说明: 1. base指向待排序数组的首地址。一般情况下,base就是数组的名字。 2. num为数组中待排序元素的数量。 3. width为数组中每个元素的大小,以字节为单位。一般为 sizeof(ElemType); 4. comp为指向比较函数的指针,用于确定排序的顺序。一般为cmp; 对长为1000的整型数组从小到大排序:
int arr[1000]; qsort(arr,1000,sizeof(int),cmp);其cmp函数为:
int cmp(const void *a, const void *b ) { return *(int *)a - *(int *)b; }
从上例可以看出,编写cmp函数是使用qsort()快排的最重要部分, 也是难点。
一、对int类型数组排序
int arr[1000]; int cmp(const void *a , const void *b) { return *(int *)a - *(int *)b; } qsort(arr,1000,sizeof(arr[0]),cmp);
二、对double类型数组排序(须注意)
double arr[1000]; int cmp(const void *a , const void *b) { return *(double *)a > *(double *)b ? 1 : -1; } qsort(arr,1000,sizeof(arr[0]),cmp);
三、对char类型数组排序
char arr[1000]; int cmp(const void *a , const void *b) { return *(char *)a - *(char *)b; } qsort(arr,1000,sizeof(arr[0]),cmp);
四、对结构体数组一级排序(按关键字x排序)
struct array { int x; int y; }arr[1000]; int cmp(const void *a , const void *b) { return (*(array *)a)->x - (*(array *)b)->x; } qsort(arr,1000,sizeof(arr[0]),cmp);
五、对结构体数组二级排序(按关键字x排序,若x相等则按关键字y排序)
struct array { int x; int y; }arr[1000]; int cmp(const void *a , const void *b) { struct array *pa = (array *)a; struct array *pb = (array *)b; if(pa->x != pb->x) return pa->x - pb->x; else return pa->y - pb->y; } qsort(arr,1000,sizeof(arr[0]),cmp);
六、对结构体数组排序(按关键字字符串排序)
struct array { char str[100]; }arr[1000]; int cmp(const void *a , const void *b) { struct array *pa = (array *)a; struct array *pb = (array *)b; return strcmp(pa->str, pb->str); } qsort(arr,1000,sizeof(arr[0]),cmp);
本例选自九度OJ 1061: 成绩排序。
有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
typedef struct student //定义学生结构体 { char name[102]; int age; int score; }student; int cmp(const void *a, const void *b) //qsort()的cmp函数 { student* sa=(student*)a; //简化后面的代码 student* sb=(student*)b; if(sa->score == sb->score) { if(!strcmp(sa->name, sb->name)) return sa->age - sb->age; //如果分数相同,名字也相同,则比较年龄 else return strcmp(sa->name, sb->name); //如果分数相同,名字不同,则比较名字 } return sa->score - sb->score; //如果分数不同则比较分数 }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C++排序函数中cmp()比较函数详解
- 下一篇: Foundation框架-学习笔记<一>