相关博文:C++之指针探究(十三):函数指针数组
相关博文:C++之指针探究(十二):指针、下标、数组及其作函数参数探究
相关博文:C++之指针探究(十一):函数名的本质和函数指针
相关博文:C++之指针探究(八):指针函数和函数指针
相关博文:C++之指针探究(十四):回调函数

qsort

  标准库为我们封装的基于数组快速排序的万能接口。

例1:qsort升序排序,这里声明为int myCompare(const void∗\ast∗ pa,const void∗\ast∗ pb)是为了泛型编程。下面(int∗\ast∗)pa使用了对一级指针的强制类型转换。

运行结果:

附例1代码:

//小问学编程
#include <stdio.h>
#include <stdlib.h>//泛型编程
int myCompare(const void* pa,const void* pb)
{if(*(int*)pa > *(int*)pb)return  1;elsereturn -1;//或
//  return *(int*)pa - *(int*)pb;//升序
//  return *(int*)pb - *(int*)pa;//降序
}int main(void)
{int arr[10] = {6,5,4,3,2,1,7,8,9,0};qsort(arr,10,4,myCompare);for(int i=0;i<10;i++){printf("%d\n",arr[i]);}return 0;
}

回调函数举例

  以int类型数组为例,实现升序排列,qsort只对compare返回的正值感兴趣,也就是当返回正值才发生交换行为。

整型类示范:

字符型示范:

对结构体一级排序:

对结构体二级排序:

例2:对字符串排序,下面的(char∗\ast∗∗\ast∗)pa使用了对二级指针的强制类型转换。

运行结果:

附例2代码:

//小问学编程
#include<stdio.h>
#include<stdlib.h>
#include <string.h>int myCompare(const void* pa,const void* pb)
{//对二级指针进行强制类型转换if(strcmp(*(char**)pa,*(char**)pb)>0)return  1;elsereturn -1;
}int main()
{char* pa[4]={"China","Apple","Google","Huawei"};qsort(pa,4,4,myCompare);for(int i=0;i<4;i++){printf("%s\n",pa[i]);}return 0;
}

例3:对下面的结构体进行二级排序,要求:先按名字排序,如果名字相同,则按成绩排序。

运行结果:

附例3代码:

//小问学编程
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _stu
{char name[10];float score;
}Stu;int myxx(const void* pa,const void* pb)
{if(strcmp(((Stu*)pa)->name,((Stu*)pb)->name)>0)return 1;else{return((Stu*)pa)->score-((Stu*)pb)->score;}
}int main()
{Stu stu[]={{"aaa",23.5},{"bbb",13.5},{"bbb",43.5},{"ccc",53.5},{"ddd",13.5},};qsort(stu,sizeof(stu)/sizeof(*stu),sizeof(Stu),myxx);for(int i=0;i<5;i++){printf("%s %f\n",stu[i].name,stu[i].score);}return 0;
}

C++之指针探究(十五):回调函数应用之qsort排序相关推荐

  1. C++之指针探究(十四):回调函数

    相关博文:C++之指针探究(十三):函数指针数组 相关博文:C++之指针探究(十二):指针.下标.数组及其作函数参数探究 相关博文:C++之指针探究(十一):函数名的本质和函数指针 相关博文:C++之 ...

  2. C++之指针探究(十六):typedef结合函数指针

    相关博文:C++之指针探究(十三):函数指针数组 相关博文:C++之指针探究(十二):指针.下标.数组及其作函数参数探究 相关博文:C++之指针探究(十一):函数名的本质和函数指针 相关博文:C++之 ...

  3. C++新特性探究(十五):bind

    相关博文:C++新特性探究(十四):function 相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essenti ...

  4. 函数指针的使用精髓 -- 回调函数+qsort的内部实现

    前言: 我们有普通指针(存放普通变量的地址).数组指针(存放数组的地址)... ... 那函数的地址可以存起来吗?可以的话该怎么用函数指针呢?这是本篇博客探讨的问题... 目录:​​​​​​​ 一.函 ...

  5. C++之指针探究(十):this指针

    前文:C++之指针探究(九):结构体指针 this指针   每一个对象都隐式地"包含"一个指针指向对象自身,称之为this指针.当对象调用成员函数时,会默认将对象自身传递给该函数, ...

  6. C++之指针探究(十二):指针、下标、数组及其作函数参数

    指针使用下标时,可以理解为数组. 例如:   char ∗\ast∗p = "abcdef";   此时p[2]值为'c':   而p表示字符串"abcdef" ...

  7. JavaScript程序开发(十五)—函数的属性和方法

    在函数内部,有两个特殊的对象-arguments和this.arguments主要是保存函数的参数,但是这个对象还有一个叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数 ...

  8. python函数助手_转jmeter(十五)函数助手

    由于时间和版本问题,其中有些内容和排版我做了修改和重新整理,使其更符合最新的jmeter版本. 一.使用jmeter函数助手 启动jmeter后,可以在JMeter的选项菜单中找到函数助手对话框(快捷 ...

  9. python将图像转换为8位单通道_【图像处理】OpenCV系列三十五--- equalizeHist函数详解...

    上一节,我们学习了如何对两个直方图进行比较,看两幅图像的相似度是多少,经过上节的学习,相信大家对compareHist函数已经有了一个清晰的理解,本届呢,我们学习如何对一幅图像进行均衡化! 1.函数原 ...

最新文章

  1. 第七周项目一-友元函数(3)
  2. java数据结构之二叉树的定义和递归实现
  3. 中小企业数据异地备份容灾解决方案
  4. 【数字信号处理】线性常系数差分方程 ( 使用 matlab 求解 “ 线性常系数差分方程 “ 示例 | A 向量分析 | B 向量分析 | 输入序列分析 | matlab 代码 )
  5. Nats的消息通信模型
  6. 数易云备开启虚拟机备份新时代
  7. 0元包邮 | 多传感器融合感知知识导图
  8. 强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!
  9. 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
  10. 具有Ubuntu和Azure Data Studio的Linux上SQL Server 2019
  11. 网页动物园2.0发布,经过几个月的努力,采用JAVA编写!
  12. python读excel表_怎么用python读取excel表格的数据
  13. 串的模式匹配算法之BF算法
  14. 请说一下你是如何理解互联网思维的?
  15. 鼠标抖动问题(macbook下安装的win7系统)
  16. 特大通知!!!CSDN和简书博客以后同步更新
  17. 算力网络 — 核心技术
  18. 二进制,八进制,十进制,十六进制转换算法
  19. 使用python实现智能浇筑方案
  20. P1823 [COI2007] Patrik 音乐会的等待

热门文章

  1. 基于JAVA+SpringMVC+Mybatis+MYSQL的论坛管理系统
  2. 计算机注册表管理,如何打开计算机注册表编辑器
  3. [******] 堆排序
  4. 简易OA漫谈之工作流设计(五,直接上级)
  5. Vertica系列: Vertica DB连接负载均衡
  6. Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例
  7. Task 6.1 校友聊之NABCD模型分析
  8. JQuery点击收起,点击展开以及部分非空小验证
  9. [Remoting FAQ]Loading a Remoting Host On IIS得到BadImageFormatException
  10. 计算机组成原理3(集中式总线判优控制、总线通信控制)