写了这么久的排序感觉还是用现成的最舒服。其实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. 写给想要入门python或者正在入门python的小朋友们

    写在前面: 最近好像python挺火,虽然我也在天天写python,但是python毕竟是动态语言,就拿常被人吐槽的java来说,python绝大不多数地方是不如java的.python只能是你的一个 ...

  2. 121、Java面向对象之使用this关键字明确地表示访问类中的属性

    01.代码如下: package TIANPAN; class Book { private String title; private double price; public Book(Strin ...

  3. Centos7 配置subversion

    CentOS7:配置SVN服务器 Posted on 2016-11-10 15:17 eastson 阅读(4266) 评论(0) 编辑 收藏 1. 安装 CentOS通过yum安装subversi ...

  4. Swift-如何快速学习Swift

    关于本文: 1.说明本文写作的目的 2.整理了Swift的基本语法树 3.看图作文 一.写作目的 昨天看了一个知识专栏,作者讲述的是“如何研究性的学习”.整个课程1个小时9分钟,花了我19块人民币.其 ...

  5. Python学习笔记之正则表达式

    本篇在写的时候大量参考了https://deerchao.cn/tutorials/regex/regex.htm的内容 一.什么是正则表达式 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂 ...

  6. Docker 基础入门

    Docker是一个开放的平台,将应用和基础设施分隔开来, 方便快速的交付软件.利用docker的提供的方法可以快速的测试和部署代码,显著的减少写代码和部署直接的延迟. Docker 平台(The Do ...

  7. 三、多线程基础-自旋_AQS_多线程上下文

    1. 自旋理解    很多synchronized里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题.既然sync ...

  8. eclipse js文件无法保存错误

    错误信息如下 Save Failedjdk.nashorn.internal.runtime.ECMAException.getEcmaError()Ljava/lang/Object; 网上多番查找 ...

  9. 解题报告:SP1043 GSS1

    题目链接:SP1043 GSS1 - Can you answer these queries I 对,\(GSS\)毒瘤数据结构题,就是我在这篇文章中提到的紫题. 相对其他\(GSS\)题简单些,但 ...

  10. struts2--通配符映射

    1.通配符映射: --规则: > 1)若找到多个匹配,没有通配符的优先: > 2)若指定动作不存在,struts2将会尝试把这个URI与任何一个包含着通配符*的动作名进行匹配: > ...