写了这么久的排序感觉还是用现成的最舒服。其实C语言其实自己带了一个快速排序在stdlib 库里,但是其函数调用的接口过于复杂,所以让人望而却步。为了加深自己的记忆,所以写下这篇博客

先来看一下函数原型

_CRTIMP void __cdecl qsort(void*, size_t, size_t, int (*)(const void*, const void*))

  看上去就很复杂 其实 CRTIMP仅仅是一个宏定义(不明白也没啥)
  其实际意义如下

    C -- C语言
    R -- run 运行
    TIM -- time 时侯
    P -- 参数

  

 __cdecl 也是个系统预定义的宏。(好像是支持,不定参数输入,例如printf,在这里应该不是这个意思,感兴趣的自行度娘)。

  void 返回 NULL,qsort函数名。
括号里:
  第一个参数是代表任意数据类型的首地址;
  第二个参数是代表任意数据类型的所用空间,即长度;
  第三个参数是代表数据类型的大小;
  第四个参数是排序方式,最麻烦的就在这里了,我们得写一个比较函数cmp()。返回 1 从小到大,返回-1,从大到小 理论不讲太多,直接看如何使用:
  
一:整数比较
int num[]; 

int cmp ( const void *a , const void *b )
{
return *(int *)a > *(int *)b ? : -;
}
qsort(num,,sizeof(num[]),cmp);

部用减法,怕数据溢出。

二、Char型比较

 char word[]; 

 int cmp( const void *a , const void *b )
{
return *(char *)a > *(char *)b ? -;
} qsort(word,,sizeof(word[]),cmp);

 三、浮点型比较

double in[]; 

int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? : -;
}
qsort(in,,sizeof(in[]),cmp);

四、结构体比较

typedef double ElemtType
struct In
{
ElemtTypedata;
int other;
}s[]; int cmp( const void *a ,const void *b)
{
return (*(struct In *)a).data > (*(struct In *)b).data ? : -;
}
qsort(s,,sizeof(s[]),cmp);

五、对结构体二级排序

struct In
{
int x;
int y;
}s[]; //按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( const void *a , const void *b )
{
struct In *c = (struct In *)a;
struct In *d = (struct In *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,,sizeof(s[]),cmp);

六、对字符串进行排序

struct In
{
int data;
char str[];
}s[]; //按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(struct In *)a)->str , (*(struct In *)b)->str );
}
qsort(s,,sizeof(s[]),cmp);

生活不易,诸君共勉

 

C语言备忘录——qsort的更多相关文章

  1. Go语言备忘录:基本数据结构

    本文内容是本人对Go语言的变量.常量.数组.切片.映射.结构体的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处,多谢! 参考书籍<Go语 ...

  2. Go语言备忘录:反射的原理与使用详解

    目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能   1.预备知识: Go的变量都是静态类 ...

  3. Go语言备忘录:net/http包的使用模式和源码解析

    本文是晚辈对net/http包的一点浅显的理解,文中如有错误的地方请前辈们指出,以免误导! 转摘本文也请注明出处:Go语言备忘录:net/http包的使用模式和源码解析,多谢!  目录: 一.http ...

  4. Go语言备忘录(3):net/http包的使用模式和源码解析

    本文是晚辈对net/http包的一点浅显的理解,文中如有错误的地方请前辈们指出,以免误导! 转摘本文也请注明出处:Go语言备忘录(3):net/http包的使用模式和源码解析,多谢!  目录: 一.h ...

  5. Go语言备忘录(2):反射的原理与使用详解

    本文内容是本人对Go语言的反射原理与使用的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(2):反射的原理与使用详解,多谢! ...

  6. Go语言备忘录(1):基本数据结构

    本文内容是本人对Go语言的变量.常量.数组.切片.映射.结构体的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(1):基本数据 ...

  7. C语言函数qsort的使用方法

    qsort函数stdlib.h文件中,函数原型为 void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,co ...

  8. C语言备忘录——取余与取模

    前几天,一个小姐姐问我取余和取模有什么区别,我当时第一反应就是二者是一样的,但是小姐姐咬死说不一样.我去百度了一下还真的不一样.脑壳疼,我当初误导了多少人.所以为了帮助我记忆也为了帮助预防我误人子弟 ...

  9. C语言备忘录——向上取整

    众所周知,C语言的取整方式是向下取整,昨天老师留了一道思考题,问我们C语言怎么向上取整,当时我第一反应就是ceil(),老师说不能用if……else之类的,函数也不行.当时想了想没事不用就不用,去ma ...

随机推荐

  1. 浅谈区块链和p2p网络

    最近对区块链产生了兴趣就去了解了一下,分享一下.... 首先要先了解一下什么叫做区块链: 区块链:简单来说就是一种基于分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式. 相信说 ...

  2. 调用百度汇率api 获取各国的汇率值

    设置一个定时任务,每天更新汇率java代码如下 package com.thinkgem.jeesite.modules.huiLvApi.service; import java.io.Buffer ...

  3. 《java核心技术:卷1》PDF版 和 Word版下载

    链接:https://pan.baidu.com/s/1OcpdZ4wfeo55xeJQQBHXRg 提取码:hds0

  4. Java最新面试题

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  5. BZOJ 4166: 月宫的符卡序列

    如果使用回文树,节点 \(u\) 的回文串和 \(fail_u\) 的回文串中心不一样,因为回文树的 \(fail\) 指针指向的是最长回文后缀,没法快速解决异或和 考虑魔改回文树,用马拉车来解决,扩 ...

  6. IDEA 服务器热部署详解(On Update action/On frame deactivation)

    https://blog.csdn.net/w15321271041/article/details/80597962 场景:一般服务器(比如tomcat,jboss等)启动以后,我们还需要进一步修改 ...

  7. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  8. hadoop的扩容

    一.横向扩容(参见:https://www.cnblogs.com/yangy1/p/12362565.html) 现在在此基础上再添加一个节点 1.克隆一台主机hdp03(克隆hdp02) 修改ip ...

  9. Day3-K-Can you solve this equation? HDU2199

    Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,can you find its solution between 0 and ...

  10. SpringBoot开发环境要求

    JDK 截止到目前Spring Boot 的最新版本:2.1.8.RELEASE 要求 JDK 版本在 1.8 以上,所以确保你的电脑已经正确下载安装配置了 JDK(推荐 JDK 1.8 版本). 构 ...