模拟实现qsort-冒泡排序

举报
芒果_Mango 发表于 2022/03/28 10:33:35 2022/03/28
1.2k+ 0 0
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

3.模拟实现冒泡排序-排序各种类型的数组

冒泡排序:
 n个元素 共进行n-1趟冒泡排序
每趟排序可以少比较一个元素,一趟可以使一个元素在特定位置上

img

//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个字节,指向下一个元素
转化为其他类型不合适
    
  交换:还要把宽度(每个元素所占字节个数)也传过去
因为交换的时候是传地址,所以要知道元素的宽度,一个字节一个字节的交换

image-20220214212000888


(char*)base + j * width, (char*)base + (j + 1) * width,

当j = 0时:比较的是第一个元素和第二个元素
  j = 1时,比较的是第二个元素和第三个元素
    ....  很妙的写法

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。