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

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个学生排序后的信息。

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;               //如果分数不同则比较分数  
}  
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值