C语言qsort函数用法

C语言qsort函数用法qsort函数简介   排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。这就是qsort函数(全称quicksort)。它是ANSIC标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)  功能:

大家好,又见面了,我是你们的朋友全栈君。

 

qsort函数简介

 

  排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)

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

 

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

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

 

 

qsort中几种常见的比较函数cmp

 

一、对int型数组排序

复制代码
int num[100];
int cmp_int(const void* _a , const void* _b)  //参数格式固定
{
    int* a = (int*)_a;    //强制类型转换
    int* b = (int*)_b;
    return *a - *b;  
}

qsort(num,100,sizeof(num[0]),cmp_int); 
复制代码

 

  可见,参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回*b-*a即可

 

 

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

复制代码
char word[100];
int cmp_char(const void* _a , const void* _b)  //参数格式固定
{
    char* a = (char*)_a;    //强制类型转换
    char* b = (char*)_b;
    return *a - *b;  
}

qsort(word,100,sizeof(word[0]),cmp_char); 
复制代码

 

 

三、对double型数组排序

复制代码
double in[100];
int cmp_double(const void* _a , const void* _b)  //参数格式固定
{
    double* a = (double*)_a;    //强制类型转换
    double* b = (double*)_b;
    return *a > *b ? 1 : -1;   //特别注意
}

qsort(in,100,sizeof(in[0]),cmp_double); 
复制代码

 

  在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系

 

 

四、对字符串进行排序

复制代码
char word[100][10];
int cmp_string(const void* _a , const void* _b)  //参数格式固定
{
    char* a = (char*)_a;  //强制类型转换
    char* b = (char*)_b;
    return strcmp(a,b);
}

qsort(word,100,sizeof(word[0]),cmp_string); 
复制代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149729.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • TestNG断言

    TestNG断言1 原理 对测试程序变量的中间状态进行断言 Assert 判断 从而辅助判断测试用例的执行是成功还是失败 2 TestNG 中常用的断言方法有 1 assertTrue 判断是否为 True 2 assertFalse 判断是否为 false 3 assertSame 判断引用地址是否相同 4 assertNotSam 判断引用地址是否不相同 5

    2025年11月20日
    3
  • awk工具详解

    awk工具详解目录awk概述awk工作原理awk命令格式awk概述AWK是一种处理文本文件的语言,是一个强大的文本分析工具。它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总

    2022年7月4日
    22
  • 网络协议篇之SNMP协议(一)——SNMP报文协议

    网络协议篇之SNMP协议(一)——SNMP报文协议前言:最近工作中遇到大量的网络协议开发,现就其中一些网络协议的基础知识进行整理,文中借鉴了一些大神的整理,后面会贴上链接,如侵删)

    2022年10月17日
    4
  • 彻底弄懂LSH之simHash算法[通俗易懂]

    彻底弄懂LSH之simHash算法[通俗易懂]马克·吐温曾经说过,所谓经典小说,就是指很多人希望读过,但很少人真正花时间去读的小说。这种说法同样适用于“经典”的计算机书籍。最近一直在看LSH,不过由于matlab基础比较差,一直没搞懂

    2022年8月5日
    6
  • 域渗透之Zerologon域提权漏洞

    域渗透之Zerologon域提权漏洞组件概述Netlogon远程协议是一个远程过程调用(RPC)接口,用于基于域的网络上的用户和计算机身份验证。Netlogon远程协议RPC接口还用于为备份域控制

    2021年12月13日
    63
  • 什么是igmp协议_igmpv3协议

    什么是igmp协议_igmpv3协议文章目录IGMP协议定义功能IGMPv1主机加入主机离开查询器选举成员报告抑制机制IGMPv2主机加入主机离开查询器选举成员报告抑制机制IGMPv3主机上维护的组播信息路由器维护的组播信息主机加入主机离开IGMPSnooping组播VLAN相关命令组播概述定义组播关注的问题解决方案组播地址地址范围地址分类组播模型ASMSSMIRF定义优势工作流程Master设备选举规则IRF堆叠协议热备份IRF形成的必要条件配置步骤相关命令IGMP协议定义组播组管理协议功能管理主机加入和离开组播组维护本

    2025年11月14日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号