当前位置: 首页 > news >正文

指针(3)

如图,这是比较常见的冒泡排序,不过只能对整形数据进行排序。本篇博文主要介绍如何模拟qsort函数实现冒泡排序对任何数据的排序。  

如果我们想对任何数据进行排序,我们可以发现,排序的趟数是固定的,我们只需要对比较大小的方式进行改造即可。

我们模仿qsort函数,并且约定如下:

改造后的代码如下:

void swap(char* buf1,char* buf2,size_t size)
{int i= 0;for (i = 0; i < size; i++){char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}void bubble_sort(void* base, size_t num,size_t size,int (*cmp)(const void* e1,const 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*size,(char*)base+(j+1)*size )>0){ swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}void test1()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);print_arr(arr, sz);bubble_sort(arr, sz,sizeof(arr[0]), cmp_int);print_arr(arr, sz);
}

整体分析:bubble_sort函数的第一个参数是void*类型,是因为我们要比较的数据类型不确定。剩下的参数均是模仿qsort函数的,详细见上一篇博文。我们自己定义了一个cmp_int函数,调用它的指针的形参名为cmp,cmp用来判断两个元素的大小。在上一篇博文中,我们说qsort使用来进行升序排序的,其实我们也可以进行降序排序,只需要将cmp()>0改成cmp()<0即可。swap函数是我们自己定义的常见的交换函数。

cmp函数分析:base是首元素的地址,因为他是void*类型,无法直接解引用,我们需要进行强制类型转换,不过为什么是转换成char*类型呢?因为char*类型可以更细致的比较,如果我们比较的是int类型的数据,与下一元素相距4个字节,而char*一次跳不了那么大的距离,所以我们需要加1*size(即数据类型的大小)。这样不管需要进行什么类型的数据的比较,我们只要在参数中给出数据的类型大小,就能直接比较,使这个函数更加通用。

相关文章:

  • 熬夜会秃头——beta冲刺Day2
  • C语言每日一题(43)旋转链表
  • 基于Intel Ai Analytics Toolkit 及边缘计算的溶氧预测水产养殖监测方案
  • 目标检测——Fast R-CNN算法解读
  • LangChain(0.0.339)官方文档四:Prompts下——prompt templates的存储、加载、组合和部分格式化
  • docker部署elasticsearch+kibana+head
  • uniapp+vue3路由跳转传参
  • 【渗透】记录阿里云CentOS一次ddos攻击
  • Jmeter对图片验证码的处理
  • C++学习之路(十五)C++ 用Qt5实现一个工具箱(增加16进制颜色码转换和屏幕颜色提取功能)- 示例代码拆分讲解
  • 基于springboot+vue的点餐系统(前后端分离)
  • 【sql】【mysql】【数据库】复杂查询中避免Join的办法
  • Gavin Wood:财库保守主义偏离了初心,应探索 Fellowship 等更有效的资金部署机制
  • powershell获取微软o365 21v日志
  • 第六十四周周报
  • Elasticsearch 参考指南(升级前重新索引)
  • Github访问慢解决办法
  • Java比较器对数组,集合排序
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • pdf文件如何在线转换为jpg图片
  • PHP的类修饰符与访问修饰符
  • Rancher-k8s加速安装文档
  • React-Native - 收藏集 - 掘金
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • spring-boot List转Page
  • Unix命令
  • v-if和v-for连用出现的问题
  • windows下使用nginx调试简介
  • zookeeper系列(七)实战分布式命名服务
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 来,膜拜下android roadmap,强大的执行力
  • 前端设计模式
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 带你开发类似Pokemon Go的AR游戏
  • ​人工智能书单(数学基础篇)
  • #{}和${}的区别是什么 -- java面试
  • #Spring-boot高级
  • (function(){})()的分步解析
  • (分布式缓存)Redis分片集群
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ***原理与防范
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET开发者必备的11款免费工具
  • .net连接oracle数据库
  • .Net中的设计模式——Factory Method模式
  • @NestedConfigurationProperty 注解用法
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [16/N]论得趣
  • [17]JAVAEE-HTTP协议