qsort函数

qsort函数使用:

qsort函数是c语言提供的库函数,功能是可以对任意数据类型的数组进行排序。

参数:
qsort
(void * vbase,    //待排序的数组首元素地址i
size_t nel,    //数组元素个数
size_t width,    //数组元素大小,单位是字节
int (*compar)(const void *, const void *))//自定义的比较函数

使用举例:


struct stu
{
	char name[20];
	int age = 0;
};
int cmp(const void* e1,const void* e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
int main()
{
	struct stu s[3]{ {"zhangsan",88},{"lisi",50},{"wangwu",22} };
	qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp);
	return 0;
}

冒泡排序模拟实现qsort函数

先给出冒泡排序代码:

void bubble_sort(int arr[],int sz)

{
	 //确定冒泡的趟数--趟数=元素数减去1,所以我们需要先确定元素个数。
	
	 int i = 0;
	 for (i = 0; i < sz - 1; i++)//假设sz=10
	 {
		 //每一趟冒号排序
		 int j = 0;
		 int flag = 1;
		 for (j = 0; j <sz-1-i ; j++)
		 {
			 if (arr[j] > arr[j + 1])
			 {
				 int tmp = arr[j];
				 arr[j] = arr[j + 1];
				 arr[j + 1] = tmp;
				 flag = 0;
			 }
		 }
		 if (flag == 1)
		 {
			 break;//----break只能用于for循环中,不能用于if语句,而在这里break用于if语句的外层循环。
		 }
	 }
}

接下来就是对代码进行改进:
先粘代码,后面解释怎么实现。

void swap(char* buf1,char* buf2,int width)
{
	for (int i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;

	}
}
void buble_sort(void* base,size_t num,size_t width,int (*cmp)(void* ,void*))
{
	int i = 0;
	int j = 0;
	for (int i = 0; i < num - 1; i++)
	{
		for (j = 0; j < num - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}

}

int cmp(void* e1, void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{

	int arr[] = { 9, 8, 7, 5, 4, 3, 2, 1, 0 };

	buble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp);
	return 0;
}

在这里插入图片描述
buble-sort函数第一个参数base:是数组首元素地址
在判断条件中,我们 需要对cmp函数进行传参
由于需要比较任何类型的数据,根据width确定base偏移量,这里比较的是int类型,一个元素是4个字节
(char*)base+j*width:
当j=0时,j+1=1,传给cmp的指针分别指向了第一个元素和第二个元素:
在这里插入图片描述

来到cmp函数,cmp形参是void*指针,需要先强制转换成你要比较的元素类型,这里的cmp是用户自己定义的函数,用户可以根据自己的需求来设定需要强制转换成什么类型的数据。
当符合判断条件时,进入swap函数
swap()函数实现的是根据数据类型,逐个字节的交换内容。
这样就实现了两个元素的交换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值