1.函数简介
功 能: 使用
快速排序例程进行排序
头文件:stdlib.h
函数原型:
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;
2.一个简单的例子
对长为1000的整型数组从小到大排序:
int arr[1000];
qsort(arr,1000,sizeof(int),cmp);
其cmp函数为:
int cmp(const void *a, const void *b )
{
return *(int *)a - *(int *)b;
}
3.各类cmp函数写法
从上例可以看出,编写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);
4.一个较复杂的例子
本例选自九度OJ 1061: 成绩排序。
有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。
有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; //如果分数不同则比较分数
}