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[100]; 

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

部用减法,怕数据溢出。

二、Char型比较

1 char word[100];
2
3 int cmp( const void *a , const void *b )
4 {
5   return *(char *)a > *(char *)b 1 ? -1;
6 }
7
8 qsort(word,100,sizeof(word[0]),cmp);

 三、浮点型比较

double in[100]; 

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

四、结构体比较

typedef double ElemtType
struct In
{
   ElemtTypedata;
   int other;
}s[100];

int cmp( const void *a ,const void *b)
{
  return (*(struct In *)a).data > (*(struct In *)b).data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp); 

五、对结构体二级排序

struct In
{
  int x;
  int y;
}s[100]; 

//按照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,100,sizeof(s[0]),cmp);

六、对字符串进行排序

struct In
{
  int data;
  char str[100];
}s[100]; 

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

生活不易,诸君共勉

 

原文地址:https://www.cnblogs.com/daker-code/p/11619299.html

时间: 2024-08-30 02:28:32

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

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

本文内容是本人对Go语言的变量.常量.数组.切片.映射.结构体的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录:基本数据结构,多谢! 参考书籍<Go语言圣经>.<Go语言实战>.<Go语言学习笔记>等 一.变量 变量是一段或多 http://pic.cnhubei.com/space.php?uid=2732&do=album&id=963169http://pic.cnhubei

C语言的qsort函数

学了这么久都不知道C语言有这个函数(其实是因为基本没写过C,除了学程序设计的时候..) qsort 的函数原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) ) 其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数.默认从小到大. 其中调用的算法是快速排序,并且是优化过的

C语言利用qsort()函数实现排序

引用#include<stdlib.h>头文件 qsort()括号里面有4个参数 第一个参数是将要排序的数组名array: 第二个参数是将要排序的数量n: 第三个参数是每个要排序的参数的大小xizeof(array[o]): 第四个参数是自己写的一个比较函数comp: 若排序的是int类型的数组 升序: int comp(const void*a,const void*b)//用来做比较的函数.{    return *(int*)a - *(int*)b;} 降序: int comp(con

C语言备忘录——运算符优先级

丢脸啊,今天写一道算法题,第一次没写对.改了半天愣是没看出来错哪,后面说出了一下过程,突然发现是运算符优先级惹得祸 if (!num % 2){ …… },!的运算优先级高于%,啊啊啊,丧心病狂我找了十来分钟,把老脸都给丢尽了.为了避免这种低级错误, 所以写下这篇博客巩固一下运算符优先级. 不叨叨,直接上表. 优先级 运算符 名称 使用方法 运算顺序 说明 1 [] 数组下标 数组名[整型表达式] 左到右   () 圆括号 (表达式)/函数名(形参表)   . 成员选择(对象) 对象.成员名  

C语言备忘录——static

对于这个关键字我一直没有弄清楚,今天特地去花了一定的时间去理解这个关键字.在函数或变量声明时,在数据类型前加上 static 后会有以下几个效果 一.用于函数定义时: 1.函数的链接属性会被修改,从extrenal 变为internal 2.函数的存储类型与作用域不受影响 二.用于变量声明时: 1.将变量的存储类型从自动变成静态 2.链接属性和作用域不受影响 3.生命周期将被延续到整个程序结束 三.最重要的一点: 无论是函数还是变量,一但被冠上static 那么他们只能在被声明的文件中访问! 针

C语言qsort函数算法性能测试

对于该算法的复杂性.一个直接的方法是测量的一定量的算法级数据的执行时间的感知. 随着C语言提供qsort对于示例.随着100一万次的数据,以测试其计算量.感知O(nlg(n))时间成本: C码如下面: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 //int (*Comp)(const void *,const void *) int compare(const vo

计数排序(C语言版)

先说说计数排序的思想: 计数排序假定待排序的所有元素都是介于0到K之间的整数:计数排序使用一个额外的数组countArray,其中第i个元素是待排序数组array中值等于i的元素的个数.然后根据数组countArray来将array中的元素排到正确的位置. 算法的步骤如下: 找出待排序的数组中最大和最小的元素 统计数组中每个值为i的元素出现的次数,存入数组countArray的第i项 对所有的计数累加(从countArray中的第一个元素开始,每一项和前一项相加) 反向填充目标数组:将每个元素i

qsort快排c语言和c++应用

C语言中用qsort()快速排序 C语言中排序的算法有很多种,系统也提供了一个函数qsort()可以实现快速排序.原型如下: void qsort(void *base, size_t nmem, size_t size, int (*comp)(const void *, const void *)); 它根据comp所指向的函数所提供的顺序对base所指向的数组进行排序,nmem为参加排序的元素个数,size为每个元素所占的字节数.例如要对元素进行升序排列,则定义comp所指向的函数为:如果

软件架构设计系列总结

架构引用维基百科:软件体系结构是构建计算机软件实践的基础.与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件构架以作为满足不同客户需求的实际系统设计方案的基础.从和目的.主题.材料和结构的联系上来说,软件架构可以和建筑物的架构相比拟.一个软件架构师需要有广泛的软件理论知识和相应的经验来实施和管理软件产品的高级设计.软件架构师定义和设计软件的模块化,模块之间的交互,用户界面风格,对外接口方法,创新的设计特性,以及高层事物的对象操作.逻辑和流程.软件