指针(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(即数据类型的大小)。这样不管需要进行什么类型的数据的比较,我们只要在参数中给出数据的类型大小,就能直接比较,使这个函数更加通用。

秦jh
+关注
目录
打赏
0
0
0
0
80
分享
相关文章
软件的各版本分类介绍
版本分类 α(Alpha)版  阿尔法版 n. 希腊字母的第一个字母;最初 adj. [化]阿尔法位的;主导的;首要的;按字母顺序的   此版本表示该软件仅仅是一个初步完成品,通常只在软件开发者内部交流,也有很少一部分发布给专业测试人员。
1475 0
三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能
众所周知,随着科技的发展和时代的进步,远程控制软件在日常工作中的运用所处可见,社会对远程控制软件的需求也在日益增长,为用户提供了便捷的远程访问和控制计算机的能力,使其在现代化社会中扮演着重要的角色。因此,市面上也出现了很多相似功能的产品,但是他们各有不同的特点和功能。本文主要介绍的是ToDesk、向日葵、TeamViewer三款远程控制软件间的不同之处,我将从安全、稳定、易用、兼容、功能几个方面来进行对比,帮助大家选择适合自己需求的远程办公软件。
365 1
三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能
Spring Cloud Stream Binder 实现
Spring Cloud Stream Binder 实现 JMS 实现 ActiveMQ 1.增加Maven依赖 <!-- 整合 Sprig Boot Starter ActiveMQ --> <!-- 间接依赖: spring jms ...
4182 0
带你读《阿里云卓越架构白皮书》——2、安全风险识别和检测
带你读《阿里云卓越架构白皮书》——2、安全风险识别和检测
408 0
「Python」爬虫-9.Scrapy框架的初识-公交信息爬取
本文将讲解如何使用scrapy框架完成北京公交信息的获取。
780 0
【汇编】Loop指令、段前缀
【汇编】Loop指令、段前缀
696 0
【汇编】Loop指令、段前缀
2021年最新版Idea,Gradle居然无法识别Lombok,真正有效的解决方案
2021年最新版Idea,Gradle居然无法识别Lombok,真正有效的解决方案
792 0
2021年最新版Idea,Gradle居然无法识别Lombok,真正有效的解决方案
AIGC主题征文开始啦
阿里云开发者社区推出“5月AIGC挑战赛”,邀您一起畅聊AIGC!
19836 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等