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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Anycast 公网加速 AIA解决方案

    Anycast 公网加速 AIA解决方案Anycast公网加速AIA简介Anycast公网加速(AnycastInternetAcceleration,AIA)是一个覆盖多地的动态加速网络,可以大幅提升您业务的公网访问体验。不同于其他应用层加速服务,AIA能实现IP传输的质量优化和多入口就近接入,减少网络传输的抖动、丢包,最终提升云上应用的服务质量,扩大服务范围,精简后端部署。Anycast公网加速AIA功能Anycast公网加速提供多种强大功能,提升应用访问体验的同时,易于部署和管理。1、公网IP任播购买

    2022年5月23日
    123
  • c#(asp.net)杂谈笔记

    c#(asp.net)杂谈笔记

    2021年6月20日
    96
  • 股票软件受限解决方法[通俗易懂]

    股票软件受限解决方法[通俗易懂]现在很多内网都限制了股票软件的连接,WAYSONLINE除了游戏,股票软件也可代理,下面给大家分享一下具体使用。WaysonlineV3.0(以下简称V3)采用全新独创设计和高效编码,结合最新网络技术,已包含SocksCap/e-border/PSD等所有拦截功能,无需另外安装第三方软件,实现透明代理(类似VPN),即无需进行复杂的代理设置,即实现应用和游戏网络代理加速。

    2022年6月24日
    35
  • ConstraintLayout 下 layout_marginLeft 属性无效问题[通俗易懂]

    ConstraintLayout 下 layout_marginLeft 属性无效问题[通俗易懂]ConstraintLayout下layout_marginLeft属性无效问题需要添加app:layout_constraintLeft_toLeftOf="parent&quo

    2022年7月2日
    58
  • 关于大数据,云计算,物联网的概述正确的是_物联网应用领域

    关于大数据,云计算,物联网的概述正确的是_物联网应用领域1、大数据时代  以大数据、物联网和云计算为标志的第三次信息化浪潮开始,大数据时代全面开启。大数据发展主要经历了三个历程。2、大数据的概念  关于什么是大数据”这个问题,大家比较认可关于大数据的“4V”说法。大数据的4个“V”,或者说是大数据的4个特点,包含4个层面:数据量大(Volume).数据类型繁多(Variety).处理速度快(Velocity)和价值密度低(Value)。3、…

    2022年10月7日
    3
  • java构造函数返回值_java构造函数总结

    java构造函数返回值_java构造函数总结构造函数总结概念:创建对象时由JVM自动调用的函数作用:在创建对象的时候给对象的成员变量赋值;写法:修饰符:可以用访问权限修饰符(public、private等)修饰;不能用static修饰;返回值类型:没有返回值类型,连void都没有;函数名:必须和类名完全一样;参数列表:可以重载,具体根据要求而定;return语句:有,但是一般都不需要写;执行过程:创建对象时,JVM遇到new…

    2022年6月16日
    70

发表回复

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

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