c语言qsort函数用法总结

qsort函数定义

快速排序是目前公认的一种比较好的排序算法,是根据二分法写的。因为他速度很快,系统也在库里实现这个算法。 这就是qsort函数(全称quicksort)。其声明在stdlib.h文件中,其时间复杂度为n*log(n)

功能:对某种类型数组按照某种规则排序(就是让数组元素的地址在数组中移动);

头文件:stdlib.h
用法:  void qsort(void* base, num, size_int ,int(__cdecl*compare)
参数: 1 待排序数组,排序之后的结果仍放在这个数组中
    2 数组中待排序元素数量
    3 各元素的占用空间大小(单位为字节)
       4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)

qsort函数比较函数cmp

qsort要求提供一个自己定义的比较函数cmp。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。

比较函数 int cmp(const void *a, const void *b) 中让两个元素的地址作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。

qsort的比较函数是 int cmp ( const void * a, const void * b ),而返回负数表示ab顺序;返回负数表示顺序相反,ba顺序;返回0表示二者“相等”,顺序不确定(因此返回的正负千万要明确)

qsort中几种常见的比较函数示例

一、对int型数组排序

升序:

int cmp_int(const void* a , const void* b)//参数格式固定不能变,针对不同类型数据只能变函数体
{
    return *((int*) a) - *((int*) b);//升序  
}
//可见,参数列表是两个无意义指针,现在他要去指向你的元素。所以需要转换为你当前的类型,然后取值,作差。默认升序排列(从小到大),也就是说,这个升序函数也可以只声明个函数名就可以。
如果想降序排列返回*b-*a即可。

 降序:

int cmp_int(const void* a , const void* b)//参数格式固定不能变,针对不同类型数据只能变函数体
{
    return *(int* b) - *(int* a);//升序  
}

示例如下:

函数调用示例:qsort(num, 50, sizeof(int), mycmp);

二、对char型数组排序


int compare1(const void *a, const void *b)//对字符数组中的字符按照升序排序
{
	return *(char *)a - *(char*)b;
}
 
int compare2(const void *a, const void *b)//对字符数组中的字符按照升序排序
{
	return *(char *)b - *(char*)a;
}

示例:将字符串数组中的元素按照长度排序

qsort(num, 50, sizeof(int), mycmp);针对连续数组本身的元素进行排序。

通过指针数组方式建立的字符串数组(并且不是直接初始化 的),无法进行qsort排序。因为存储并不是像一开始初始化一样,存储结构是一维连续的。是二维的。

三、对double型数组排序

一定注意,浮点数作差返回为int型之后,就不能表达出大小性质了

double in[100];
int cmp_double(const void* a , const void* b)
{
    return *(double* a) > *(double* b) ? 1 : -1;   //特别注意
}
//在对浮点或者double型的一定要用三目运算符,因为如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系

四、对字符串进行排序

五、对结构体数组进行排序

使用 qsort 的灵魂魅力在于比较函数的编写!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值