牛骨文教育服务平台(让学习变的简单)
博文笔记

C/C++中的qsort()函数及其cmp()

创建时间:2014-01-21 投稿人: 浏览次数:2277
功 能:   使用快速排序例程进行排序 头文件: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; 对长为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;               //如果分数不同则比较分数  
}  
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。