C语言备忘录——qsort
写了这么久的排序感觉还是用现成的最舒服。其实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的更多相关文章
- Go语言备忘录:基本数据结构
本文内容是本人对Go语言的变量.常量.数组.切片.映射.结构体的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处,多谢! 参考书籍<Go语 ...
- Go语言备忘录:反射的原理与使用详解
目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能 1.预备知识: Go的变量都是静态类 ...
- Go语言备忘录:net/http包的使用模式和源码解析
本文是晚辈对net/http包的一点浅显的理解,文中如有错误的地方请前辈们指出,以免误导! 转摘本文也请注明出处:Go语言备忘录:net/http包的使用模式和源码解析,多谢! 目录: 一.http ...
- Go语言备忘录(3):net/http包的使用模式和源码解析
本文是晚辈对net/http包的一点浅显的理解,文中如有错误的地方请前辈们指出,以免误导! 转摘本文也请注明出处:Go语言备忘录(3):net/http包的使用模式和源码解析,多谢! 目录: 一.h ...
- Go语言备忘录(2):反射的原理与使用详解
本文内容是本人对Go语言的反射原理与使用的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(2):反射的原理与使用详解,多谢! ...
- Go语言备忘录(1):基本数据结构
本文内容是本人对Go语言的变量.常量.数组.切片.映射.结构体的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(1):基本数据 ...
- C语言函数qsort的使用方法
qsort函数stdlib.h文件中,函数原型为 void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,co ...
- C语言备忘录——取余与取模
前几天,一个小姐姐问我取余和取模有什么区别,我当时第一反应就是二者是一样的,但是小姐姐咬死说不一样.我去百度了一下还真的不一样.脑壳疼,我当初误导了多少人.所以为了帮助我记忆也为了帮助预防我误人子弟 ...
- C语言备忘录——向上取整
众所周知,C语言的取整方式是向下取整,昨天老师留了一道思考题,问我们C语言怎么向上取整,当时我第一反应就是ceil(),老师说不能用if……else之类的,函数也不行.当时想了想没事不用就不用,去ma ...
随机推荐
- MYSQL 查询指定日期后的15天
SELECT s.id, s.exhi_id, s.commission, s.order_main_id, s.create_date, s.fen_xiao_id, s.state, s.upda ...
- listenTo - backbone.js
listenToobject.listenTo(other, event, callback) 让 object 监听 另一个(other)对象上的一个特定事件.不使用other.on(event, ...
- 常见Http状态码大全详解
HTTP状态码的分类 HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用.HTTP状态码共分为5种类型: 具体如下: 状态码 内容 详细内容 信息告知 - ...
- 【快学springboot】6.WebMvcConfigurer配置静态资源和解决跨域
勘误 有个朋友说:为什么我配置了WebMvcConfigurer,静态资源static依然能访问?! 这里是本人的失误,我在启动类中添加了EnableWebMvc注解(文章里却没有提及,最好的做法是放 ...
- lnmp一键安装的缺点???
自己尝试几次在新的服务器上安装lnmp环境,每次都是一键安装,然后在/home/wwwroot/default目录下放对应的PHP文件就Ok了,很方便.其实也尝试过用命令行,就是很多命令的那种安装,中 ...
- AngularJS 官方启动文档
参考:https://angular.io/guide/quickstart 中文:http://www.angularjs.net.cn/
- Hadoop端口与界面
NameNode:7180 Cloudera Manager集群管理界面: NameNode:50070 NameNode Web UI/数据管理界面: NameNode:8020/9000 Ha ...
- 解题报告:luogu P5536 【XR-3】核心城市
题目链接:P5536 [XR-3]核心城市 这题是某次月赛题. 这题我完全是看标签猜的. 优先选择直径中点即可,这里重要的是互通,很容易想到用堆维护可选的,预处理直径和距叶节点距离即可(最近),实质上 ...
- L1和L2范数理解
参考:https://www.jianshu.com/p/4bad38fe07e6
- 「译」forEach循环中你不知道的3件事
前言 本文925字,阅读大约需要7分钟. 总括: forEach循环中你不知道的3件事. 原文地址:3 things you didn't know about the forEach loop in ...