qsort函数C语言

qsort函数

什么是qsort函数

qsort函数是一个库函数,一个基于快速排序算法实现的一个排序函数。
这是qsort函数的声明

1. qsort函数声明

在这里插入图片描述
void—— 其中函数的返回类型是不返回任何值;
base——首先告诉qsort函数需要排序数据数组的起始位置,位置使用指针保存和传递;
num——然后告诉qsort函数需要排序数据数组的元素个数;
width——再告诉qsort函数需要排序数据数组其中一个数组元素的字节大小;
compare—— 最后告诉qsort函数一个比较函数的函数指针,同时给出比较函数中待比较的两个数据元素的地址。

2. void* 指针

void* 指针是五确切类型的指针,不能直接解引用!!!!!它相当于“垃圾桶”。需要先强制类型转换,再解引用。eg:* (int*) elem1;

3. 比较函数

把一个函数指针给qsort函数,这个指针指向使用者自定义的比较函数。
在这里插入图片描述
要求qsort函数的使用者自定义一个比较函数。如果排序的是整型数据可以用<,>等比较,但是如果排序的是结构体数据:按照身高或者体重或者其他的排序,就可能不方便直接使用<,>比较,所以使用者根据实际情况提供一个比较函数实现两个数据的比较。返回类型是int类型。

代码实例

演示qsort()函数用法:

int int_cmp(const void* e1, const void* e2)
{
	return (*(int*)e1-*(int*)e2);
}

int main()
{
	int arr[] = { 1,5,7,3,6,9,8,4 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), int_cmp);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

使用冒泡方式模拟实现qsort函数

//比较函数,e1>e2返回>0的数,e1<e2返回<0的数,e1=e2返回0
int int_cmp(const void* e1, const void* e2)
{
	return (*(int*)e1 - *(int*)e2);
}

//交换函数,由于qsort作者最开始不知道我们要交换的比较数据是什么类型的,所以都是void*,再强制类型转换成char*使用
void _swap(void* p1, void* p2, int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *((char*)p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = tmp;
	}
}

//冒泡方式模拟qsort函数
void my_qsort(void* base, int num, int size, int (*cmp)(void*, void*))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < num - 1; i++)
	{
		for (j = i+1; j < num; j++)
		{
			if (cmp((char*)base + i * size, (char*)base + j* size) > 0)
			{
				_swap((char*)base + i * size, (char*)base + j * size, size);
			}
		}
	}
}

int main()
{
	int arr[] = { 1,5,7,3,6,9,8,4 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_qsort(arr,sz,sizeof(arr[0]), int_cmp);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值