指针(3)

简介: 指针(3)

如图,这是比较常见的冒泡排序,不过只能对整形数据进行排序。本篇博文主要介绍如何模拟qsort函数实现冒泡排序对任何数据的排序。
image.png
如果我们想对任何数据进行排序,我们可以发现,排序的趟数是固定的,我们只需要对比较大小的方式进行改造即可。
image.png
我们模仿qsort函数,并且约定如下:
image.png
```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+jsize,(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(即数据类型的大小)。这样不管需要进行什么类型的数据的比较,我们只要在参数中给出数据的类型大小,就能直接比较,使这个函数更加通用。

目录
相关文章
|
算法 计算机视觉
yolov5 deepsort-船舶目标检测+目标跟踪+单目测距+速度测量(代码+教程)
yolov5 deepsort-船舶目标检测+目标跟踪+单目测距+速度测量(代码+教程)
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的傣族节日及民间故事推广小程序附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的傣族节日及民间故事推广小程序附带文章源码部署视频讲解等
80 0
|
存储 JSON JavaScript
js必备知识小结(二)
js必备知识小结(二)
73 0
|
搜索推荐 iOS开发
你对于iTunes的了解有多少?
这篇文章将探讨读者对于iTunes的了解程度。iTunes是一款由苹果公司开发的多媒体管理软件,早期主要用于音乐的购买和管理,后来扩展到电影、电视节目和应用程序等领域。它在数字音乐销售和下载方面起到了重要作用,并且与苹果的iPod和iPhone等设备密切相关。本文将提供一些关于该软件的基本知识。
353 0
select下拉框选择触发事件
select下拉框选择触发事件
194 0
|
程序员 Python
python中函数的序列传参,列表拆解传参、字典拆解传参
python中函数的序列传参,列表拆解传参、字典拆解传参
329 0
|
iOS开发
ios实战-runloop实现的同步弹窗
我们知道UIAlertView使用delegate返回数据实现的,使用麻烦,之前介绍过用Block实现的例子《ios实战-使用Block的UIAlertView》 今天介绍使用runloop实现,用return返回点击的结果的方式
228 0
|
NoSQL MongoDB 开发者
再增加一个路由节点|学习笔记
快速学习再增加一个路由节点
|
人工智能 搜索推荐 双11
为什么只有淘宝能长出5000亿规模直播电商?
淘宝直播,经济学家说,这就是一种新的生意,一种新的分工形态;社会学家会说,这是一种新的信任方式,改变了消费者的决策模式。
220 0
为什么只有淘宝能长出5000亿规模直播电商?
|
物联网 编译器 定位技术
QT应用编程: 开发串口调试助手
QT应用编程: 开发串口调试助手
353 0
QT应用编程: 开发串口调试助手