qsort快排函数

C语言编程 专栏收录该内容
21 篇文章 1 订阅

1.函数介绍

qsort
qsort就是C语言中的快排函数,包含在stdlib.h头文件中,函数一共有四个参数,没有返回值。

//int (*cmp)(const void *,const void *);
qsort(*s, n, sizeof(s[0]), cmp);
其中第一个参数s是一个地址,即参与排序的首地址;
n是需要排序的数量;
sizeof(s[0])则是每一个元素占用的空间大小;
cmp是指向函数的指针,用于确定排序的顺序:
  返回正数就是说 cmp 传入参数第一个要放在第二个后面, 
  负数就是传入参数第一个要放第二个前面, 
  如果是 0, 那就无所谓谁前谁后。

qsort 要求提供一个自定义的比较函数,用于确定排序的数据类型与排序顺序:
int cmp(const void *a,const void *b);

可以看出返回值必须是int,两个参数的类型都是const void*,即指向常量数据的可变的通用指针,形参指针可以改变指向,但是不能改变器指向的存储单元中的数据,而void*作为形式参数类型,可以接受任何类型的实参指针,因此该比较函数的定义就明确了qsort可以对各种数据类型进行快排。

2. 函数应用

下面针对各种类型的数据快排的示例:

如果要排序的数据类型确定了,此时定义cmp比较函数,形参可以直接定义为相应类型的指针,而不使用通用指针的形参,不过建议使用通用指针做形参,时刻提醒我们可以比较其他的数据类型,然后在函数体内进行一个强制类型转换就ok了。

一、对int类型数组排序

int num[100];

int cmp ( const void *a , const void *b ) //当然,可以直接写为int cmp ( const int\* a , const int\* b ) 

{ return *(int *)a - *(int *)b; }

qsort(num,100,sizeof(num[0]),cmp);

二、对char类型数组排序(同int类型)

char word[100];

Sample: int cmp( const void *a , const void *b )

{ return *(char *)a - *(int *)b; }

qsort(word,100,sizeof(word[0]),cmp);

三、对double类型数组排序

double in[100];

int cmp( const void *a , const void *b )

{ return *(double *)a > *(double *)b ? 1 : -1; }

qsort(in,100,sizeof(in[0]),cmp)

四、对结构体类型(double, 字符串)数据排序

struct node
{
     double date;
     int no;
     char str[100];
} s[100];
//按照data的值从小到大将结构体排序
int cmp(const void *a,const void *b)
{ return (*(struct node*)a).data > (*(struct node*)b).data ? 1 : -1; }

//按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(struct node* )a)->str , (*(struct node* )b)->str);
}

qsort(s,100,sizeof(s[0]),cmp);

五、对结构体二级排序

struct node{ 
int x; 
int y; 
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( const void *a , const void *b )
{
struct node* c = (struct node*)a; 
struct node* d = (struct node*)b;

if(c->x != d->x)
          return c->x > d->x ? 1:-1;
else
          return d->y > c->y ? 1:-1;
}

qsort(s,100,sizeof(s[0]),cmp);

参考:
https://blog.csdn.net/yanbao4070/article/details/80171351
https://blog.csdn.net/f_zyj/article/details/51484751


3. 关于qsort实现的细节

可以参考:https://blog.csdn.net/liumiaocn/article/details/109441556

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值