C++之指针探究(十五):回调函数应用之qsort排序
相关博文: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排序相关推荐
- C++之指针探究(十四):回调函数
相关博文:C++之指针探究(十三):函数指针数组 相关博文:C++之指针探究(十二):指针.下标.数组及其作函数参数探究 相关博文:C++之指针探究(十一):函数名的本质和函数指针 相关博文:C++之 ...
- C++之指针探究(十六):typedef结合函数指针
相关博文:C++之指针探究(十三):函数指针数组 相关博文:C++之指针探究(十二):指针.下标.数组及其作函数参数探究 相关博文:C++之指针探究(十一):函数名的本质和函数指针 相关博文:C++之 ...
- C++新特性探究(十五):bind
相关博文:C++新特性探究(十四):function 相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essenti ...
- 函数指针的使用精髓 -- 回调函数+qsort的内部实现
前言: 我们有普通指针(存放普通变量的地址).数组指针(存放数组的地址)... ... 那函数的地址可以存起来吗?可以的话该怎么用函数指针呢?这是本篇博客探讨的问题... 目录: 一.函 ...
- C++之指针探究(十):this指针
前文:C++之指针探究(九):结构体指针 this指针 每一个对象都隐式地"包含"一个指针指向对象自身,称之为this指针.当对象调用成员函数时,会默认将对象自身传递给该函数, ...
- C++之指针探究(十二):指针、下标、数组及其作函数参数
指针使用下标时,可以理解为数组. 例如: char ∗\ast∗p = "abcdef"; 此时p[2]值为'c': 而p表示字符串"abcdef" ...
- JavaScript程序开发(十五)—函数的属性和方法
在函数内部,有两个特殊的对象-arguments和this.arguments主要是保存函数的参数,但是这个对象还有一个叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数 ...
- python函数助手_转jmeter(十五)函数助手
由于时间和版本问题,其中有些内容和排版我做了修改和重新整理,使其更符合最新的jmeter版本. 一.使用jmeter函数助手 启动jmeter后,可以在JMeter的选项菜单中找到函数助手对话框(快捷 ...
- python将图像转换为8位单通道_【图像处理】OpenCV系列三十五--- equalizeHist函数详解...
上一节,我们学习了如何对两个直方图进行比较,看两幅图像的相似度是多少,经过上节的学习,相信大家对compareHist函数已经有了一个清晰的理解,本届呢,我们学习如何对一幅图像进行均衡化! 1.函数原 ...
最新文章
- 第七周项目一-友元函数(3)
- java数据结构之二叉树的定义和递归实现
- 中小企业数据异地备份容灾解决方案
- 【数字信号处理】线性常系数差分方程 ( 使用 matlab 求解 “ 线性常系数差分方程 “ 示例 | A 向量分析 | B 向量分析 | 输入序列分析 | matlab 代码 )
- Nats的消息通信模型
- 数易云备开启虚拟机备份新时代
- 0元包邮 | 多传感器融合感知知识导图
- 强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!
- 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
- 具有Ubuntu和Azure Data Studio的Linux上SQL Server 2019
- 网页动物园2.0发布,经过几个月的努力,采用JAVA编写!
- python读excel表_怎么用python读取excel表格的数据
- 串的模式匹配算法之BF算法
- 请说一下你是如何理解互联网思维的?
- 鼠标抖动问题(macbook下安装的win7系统)
- 特大通知!!!CSDN和简书博客以后同步更新
- 算力网络 — 核心技术
- 二进制,八进制,十进制,十六进制转换算法
- 使用python实现智能浇筑方案
- P1823 [COI2007] Patrik 音乐会的等待
热门文章
- 基于JAVA+SpringMVC+Mybatis+MYSQL的论坛管理系统
- 计算机注册表管理,如何打开计算机注册表编辑器
- [******] 堆排序
- 简易OA漫谈之工作流设计(五,直接上级)
- Vertica系列: Vertica DB连接负载均衡
- Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例
- Task 6.1 校友聊之NABCD模型分析
- JQuery点击收起,点击展开以及部分非空小验证
- [Remoting FAQ]Loading a Remoting Host On IIS得到BadImageFormatException
- 计算机组成原理3(集中式总线判优控制、总线通信控制)