关于冒泡排序实现任意类型的排序

2023-12-30 13:18:55

大家好,大家都知道排序在程序算法设计中起到了非常关键的作用,那么今天我想给大家讲讲qsort这个函数以及它的模拟实现。

? ? ? ? 下面让我们看看qsort这个函数(这个函数内部是快速排序)

大家可以看到这个函数有四个参数,那么这四个参数是代表着什么意思呢。

void* base;//这个指针指向数组的首元素
size_t num;//代表数组有多少个元素。
size_t size;//代表一个元素多大。
int(*compar)(const void*,const void*);//这是一个返还类型为int,参数是const void*的函数指针,

这个函数能实现任意数据类型的排序,无论是int char double 还是结构体他都可以,那么它是怎么实现的呢。其实只要把它的几个参数搞清楚就行了

void bubble_qsort(void* base,size_t sz,size_t wight,int(*compar)(const void*, const void*))
{
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if ((compar(((char*)base + width * j), (char*)base + width * (j + 1))) > 0)//比较两个数
			{
				//交换
				swap(((char*)base + width * j), ((char*)base + width * (j + 1)),width);

			}
		}
	}

}

大家可以看看这串代码,

void swap(char* p1, char* p2,int wight)//交换函数
{
	//完成交换
	for (int i = 0; i < wight; i++)
	{
		char tmp = 0;
		tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}

这里是交换的代码也是按照冒泡排序来写的,这个是一个字节一个字节的交换的所以我们要把width传过来。

typedef struct stu
{
	char name[20];
	int age;
	int sorce;

}St;
//定义一个关于学生的结构体
int compar_name(const void* p1, const void* p2)
{
	return strcmp(((St*)p1)->name, ((St*)p2)->name);
}//结构体名字的比较大小
int compar_age(const void* p1, const void* p2)
{
	return (((St*)p1)->age- ((St*)p2)->age);
}//结构体年龄的比较大小

int compar_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}//整数的比较大小

按照年龄

文章来源:https://blog.csdn.net/qq_62465071/article/details/135278727
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。