练习和模拟实现qsort排序函数

练习使用qsort函数
void qsort( void *base,使用qsort首先需要传要排序的地址,
              size_t num, 待排序的数据元素个数
              size_t width,每一个元素的大小,是多少字节的
              int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
        最后一个是要参数是 排升序还是降序的函数,
        这个函数的返回类型是int 参数有两个,分别是const void* e1,
        和const void* e2 这个函数的功能就是比较传入的两个参数的大小,如果返回大于0
        则是降序,如果返回小于0就是升序
 

//这是我们自己写的判断升序或是降序的函数

int cmp_arr(const void* e1, const void* e2)
{			
	return (*(int*)e2) - (*(int*)e1);
}
void test1()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_arr);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

struct stu
{
	int age;
	char name[20];
};
int cmp_struct(const void* e1, const void* e2)
{
	//这里要把void* 强转成 我们要排序的类型,由于qsort没有帮我们做这一步,所以我们要自己强转
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
//排序结构体也是可以的
void test2()
{
	struct stu S[] = { {20,"zhangsan"}, {15,"lisi"}, {30,"wangwu"} };
	int sz = sizeof(S) / sizeof(S[0]);
	qsort(S, sz, sizeof(S[0]), cmp_struct);
}
int main()
{
	test1();
	test2();
	return 0;
}

d5aa83451829473cb810a1faf438b325.png

//模拟实现qsort
 

void Swap(char* e1, char* e2, int width)
{
	//这里根据字节大小来判断循环次数,交换两个指针的每个字节数据
	for (int i = 0; i < width; i++)
	{
		char tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		e1++;
		e2++;
	}
}
int cmp_arr(const void* e1, const void* e2)
{			
	return (*(int*)e1) - (*(int*)e2);
}
//由于我们要写一个适应多个类型的排序函数,所以我们不清楚具体是那个类型的,这里只能用void*来接收,再根据要排序的个数,和一个数的字节大小,来判断
void bubble_sort(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{
	int flag = 1;//加这个是为了,提前退出循环,假如我们要排序的数组已经是有序的了,直接就在第一轮循环结束时跳出
	for (int i = 0; i < sz-1; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			//主要是这个位置利用我们自己写的判断函数,判断要升序还是降序
			if ((cmp_arr((char*)base + j * width, 
						(char*)base + (j + 1) * width))>0)
			{
				//交换的话,我们需要传三个参数,一个是第一个元素的地址,和第二个元素的地址,第三个元素传的是一个元素字节大小
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
				flag = 0;
			}
		}
		//加这个是为了,提前退出循环,假如我们要排序的数组已经是有序的了,直接就在第一轮循环结束时跳出
		if (flag == 1)
		{
			break;
		}
	}
}
int main()
{
	int arr[] = {6,4,3,1,4,7,9,1,3,0};
	int sz = sizeof(arr) / sizeof(arr[0]);//sizeof这里对应的是单独的数组名,所以这里取的是整个数组的大小
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_arr);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值