模拟实现qsort-冒泡排序
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...
大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog
- 掘金LV3用户 https://juejin.cn/user/1381426159953960
- 阿里云社区专家博主,星级博主,技术博主 https://developer.aliyun.com/profile/expert/5lkdbuggiiuhc
- 华为云云享专家 https://bbs.huaweicloud.com/community/myhomepage
3.模拟实现冒泡排序-排序各种类型的数组
冒泡排序:
n个元素 共进行n-1趟冒泡排序
每趟排序可以少比较一个元素,一趟可以使一个元素在特定位置上
//qsort排序
//void qsort(void* base, //要比较的数组
// size_t num, //个数
// size_t width, //每一个元素的字节
// int(__cdecl* compare)(const void* elem1, const void* elem2));
//模拟实现
//cmp:是函数指针,指向的是 比较函数(自己写)
////比较整形
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
//比较浮点数
int cmp_float(const void* e1, const void* e2)
{
if ((*(float*)e1 - *(float*)e2) > 0.00000)
return 1;
else if ((*(float*)e1 - *(float*)e2) == 0.000000)
return 0;
else
return -1;
}
//比较字符
int cmp_char(const void* e1, const void* e2)
{
//本质是字符串比较->使用strcmp函数
return *(char*)e1 - *(char*)e2;
}
//交换 --一个字节一个字节的交换,共交换width次
void Swap(char* buf1, char* buf2, size_t width)
{
size_t i = 0;
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void my_BubbleSort(void* base, size_t num,size_t width, int(*cmp)(const void* e1, const void* e2))
{
//冒泡排序
//若要排序n个元素,只需要进行n-1趟
//每一趟可以少比较一个元素,每一趟可以使一个元素在确定的位置上
//num:要排序元素的个数 类型是size_t
//num是无符号数 防止产生警告 所以i和j也定义为size_t
// size_t == unsigned int
size_t i = 0;
size_t j = 0;
//共进行num-1趟
for (i = 0; i < num; i++)
{
//每一趟
for (j = 0; j < num - 1 - i; j++)
{
//比较
//传地址
//相邻两个元素比较 width:宽度,每个元素所占字节
//排成升序
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
//交换两数
Swap( (char*)base + j * width, (char*)base + (j + 1) * width, width );
}
}
}
}
注意:
两数比较时,是把地址传过去,
base是指向最开始的地址
base是void*类型 转化为什么类型更合适呢?
现在把width宽度也传过去了,即每个元素所占字节数,
char* +1跳过一个字节,+width:跳过width个字节,指向下一个元素
转化为其他类型不合适
交换:还要把宽度(每个元素所占字节个数)也传过去
因为交换的时候是传地址,所以要知道元素的宽度,一个字节一个字节的交换
(char*)base + j * width, (char*)base + (j + 1) * width,
当j = 0时:比较的是第一个元素和第二个元素
j = 1时,比较的是第二个元素和第三个元素
.... 很妙的写法
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)