目录

一.回调函数

二.qsort函数

三.void*指针

四.用qsort函数进行升序排序

1.整形数组排序

2.结构体数组排序

3.字符数组排序

五.使用冒泡排序模拟实现qsort函数


一.回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个
函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数
的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进
行响应。

二.qsort函数

qsort是一个函数,基于快速排序算法实现的一个排序函数。

这是MSDN上面的介绍:

void qsort(void* base,       //待排序数据的起始位置size_t num,         //数组的元素个数size_t width,       //一个元素的字节大小int(*cmp)(const void* elem1, const void* elem2)//cmp是一个函数指针,指向一个比较函数,需 //要自己编写,elem1,elem2是两个待比较元素的地址

返回值大小         注意:排序整形数据可以用> <,但排序结构体数据可能不方便用> <比较了。

三.void*指针

相当于通用的指针类型,可以存放指向任何类型的指针,当你的函数参数类型不确定时,可以使用 void *,不能解引用和+-整数运算。

四.用qsort函数进行升序排序

1.整形数组排序

int i_cmp (const void* e1, const void* e2)          //qsort默认升序排序,想要降序排序只需要调                                                                              换e1和e2即可
{return *((int*)e1) - *((int*)e2);     //void*指针不能解引用,需要强制类型转换为int*型
}
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), i_cmp);print(arr, sz);return 0;
}

2.结构体数组排序

struct Stu
{char name[20];int age;double score;
};
int j_cmp_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//int j_cmp_by_name(const void*e1,const void* e2)
//{
//    return strcmp( ((struct Stu*)e1)->name , ((struct Stu*)e2)->name)  //字符串比较大小要使 用strcmp函数
//}
int main()
{struct Stu stu[3] = { {"lisi",20,70.2},{"wangwu",23,88.5},{"zhangsan",18,90.2}};int sz = sizeof(stu) / sizeof(stu[0]);qsort(stu, sz, sizeof(stu[0]), j_cmp_by_age);   //通过年龄来排序//qsort(stu,sz,sizeof(stu[0]), j_cmp_by_name);   //通过姓名来排序printf("%s %d\n", stu[0].name, stu[0].age);printf("%s %d\n", stu[1].name, stu[1].age);printf("%s %d\n", stu[2].name, stu[2].age);return 0;
}

strcmp返回值大小和qsort函数返回值恰好一样,srtcmp函数比较2个字符串大小,一个字符一个字符进行比较,按ASCII值比较大小。

3.字符数组排序

int f_cmp(const void* e1, const void* e2)
{return *((char*)e1) - *((char*)e2);
}
void print(char arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%c ",arr[i]);}
}
int main()
{char arr[] = "dfesagc";int sz = strlen(arr);qsort(arr, sz, sizeof(arr[0]), f_cmp);print(arr, sz);return 0;
}

五.使用冒泡排序模拟实现qsort函数

int cmp(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}
void Swap(char* buff1, char* buff2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *buff1;*buff1 = *buff2;*buff2 = tmp;buff1++;buff2++;}
}
//因为交换的时候是传地址,所以要知道元素的宽度,一个字节一个字节的交换 ,这样也证明了使用char*指 //针的好处!
void bubble_sort(void* base, int num, int width, int (*cmp)(void* e1, void* e2))
{int i = 0;for (i = 0; i < num - 1; i++)       //趟数{int j = 0;for (j = 0; j < num - 1 - i; j++){if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)  //升序排序//j = 0时,比较的是第一个元素和第二个元素// j = 1时,比较的是第二个元素和第三个元素{Swap((char*)base + j * width, (char*)base + (j + 1) * width, width); //交换}}}
}
void test()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;bubble_sort(arr, sz, sizeof(arr[0]), cmp);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{test();return 0;
}

简单介绍一下qsort函数相关推荐

  1. vcg函数值_简单介绍几种函数信号发生器的原理图及不同功能设计

    简单介绍几种函数信号发生器的原理图及不同功能设计 前言 随着大规模集成电路的迅速发展,函数发生器的应用也逐渐广泛起来.函数信号发生器(函数信号发生器的使用)是一种在科研和生产中经常用到的基本波形产生器 ...

  2. 简单介绍Javascript匿名函数和面向对象编程

    忙里偷闲,简单介绍一下Javascript中匿名函数和闭包函数以及面向对象编程.首先简单介绍一下Javascript中的密名函数. 在Javascript中函数有以下3中定义方式: 1.最常用的定义方 ...

  3. 趣谈C语言之qsort函数

    在学习c语言的时候,我们接触到了冒泡排序,利用冒泡排序我们可以快速的对一个数组进行大小的比较,可是大家有没有想过一个问题,有没有一种排序方式可以排序任何类型的元素类型的呢?答案是有的,它是qsort函 ...

  4. qsort函数(C语言)

    目录 介绍: 不同类型 struct Stu(对比字符串): int: char: 介绍: qsort()函数是 C 库中实现的快速排序算法,包含在 stdlib.h 头文件中.函数原型如下: voi ...

  5. 求介绍matlab函数用法的书,MATLAB初学者教程--函数用法的简单介绍

    1.4 函数用法的简单介绍 1.4.1什么是函数 似乎很多人一听到函数这个词就会想到数学中的某个概念,然后对于恐惧数学的同学就开始打退堂鼓.在matlab当中到处可以用到函数,它的出现可以让我们用很简 ...

  6. c 语言重载参数类型不同重载和,C++基础学习之函数重载的简单介绍

    前言 我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同.例如:交换两个数的值其中包括(int, float,char,double)这些个类型.在C语言中我们是利用不同的函数 ...

  7. 关于main函数中argc和argv的简单介绍

    一般来说,刚开始学习写程序的人员经常会碰到如下形式的main函数,int main(int argc, char** argv)或者int main(int argc, char* argv[]),或 ...

  8. Java 的toString() 和 equals()函数简单介绍

    toString() 和 equals() 都是java面试中经常问到的地方. 特别是1条经典问题:  equals 和 "==" 的区别... 本文就从简单介绍下这两个objec ...

  9. 【转】简单介绍几个CDS视图聚合函数

    今天简单介绍几个CDS视图聚合函数. 1.SUM 代码举例如下: @AbapCatalog.sqlViewName: 'ZCDS_AGGR' @AbapCatalog.compiler.compare ...

最新文章

  1. mysql刷新连接_MYSQL频繁出现连接失败,刷新后正常的解决办法
  2. ArcObjects中的几何对象简介(一)
  3. es6箭头函数_ES6语法之-箭头函数
  4. c盘扩展卷是灰色的_技术丨电脑C盘装太满?这几招轻松释放空间
  5. Ambari 2.6.0 HDP 2.6.3集群搭建
  6. 无线鼠标可以强制配对_赛睿Rival 3 Wireless游戏鼠标评测:无限全能
  7. MYSQL AND OR的联用
  8. dj鲜生-19-登陆功能-利用内置认证体系
  9. 95-860-045-源码-定时器-InternalTimerService
  10. 计算机视觉常用图像软件对比和分析
  11. 华北电力保定校区学计算机好吗,华北电力大学保定校区计算机专业
  12. java 聊天室 私聊_使用socket实现网络聊天室和私聊功能
  13. 国产电子书的代表作是什么样的?
  14. js移动手机号码验证
  15. 常用工具:IDEA、vs code、Navicat、Postman、HBuilderX、微信开发者工具
  16. linux cadaver 命令,【Linux学习第三篇】[Tab].[Ctrl]-c.[Ctrl]-d
  17. CG中DCC什么是?
  18. s5k4ba摄像头驱动分析
  19. 电容触摸测试MCU的灵活性
  20. android 微信6.2.0 AndroidManifest.xml

热门文章

  1. .NetCore框架Surging系列(八)性能评估
  2. 2020-11-10,待业快乐
  3. CAD制图查询CAD图纸中的点坐标
  4. Linux运维最新关注!如何为自己打造一个 网络安全军火库 ?
  5. 转】函数式编程另类指南
  6. 多图片|单图片上传 tp3
  7. MAVEN中编译时出现 实际参数列表和形式参数列表长度不同
  8. 大数据建模培训Python
  9. 根据以上数据,为我定制一周的锻炼计划,一周3天训练左右,包含一些健身房和户外的运动,列出每次训练的详细动作,包括重量时间,消耗的卡路里...
  10. CF 578B Or Game