关于qsort函数的分析以及用冒泡排序思想模拟实现回调函数

本文详细介绍了C语言标准库中的qsort函数,包括其参数含义及使用注意事项。特别是重点解析了compar参数,它是一个比较函数,用于定义排序规则。此外,文章还通过冒泡排序的思想模拟实现了qsort函数,帮助读者更深入地理解排序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

qsort函数
qsort函数的定义为:

void qsort (void* base, size_t num, size_t size, int (compar)(const void,const void*));

这是c语言标准库中对qsort函数的定义,共有四个参数:
1)->void *base :是要排序的数组名(或者可以理解为数组首元素地址)
2)->size_t num :是数组元素个数,即要排序的元素个数
3)->size_t size :是元素类型大小,即数组是 int a[],则size = sizeof(int),以此类推
4)->int (*compar)(const void *,const void *) :这是一个函数指针,对应的函数是比较函数,返回值必须是int类型,在升序情况下:如果前面的数小于后面的数,此函数返回大于零的数,如果等于,此函数返回零,小于返回小于零的数。另外,因为此函数参数是void *,则在函数体内要对void * 进行强转,对 int 类型排序就强转为(int *).下面会有例子是实现:

本例子是使用冒泡排序的思想模拟实现qsort函数(准确的来说不是qsort()函数,因为在c语言库中qsort使用的是快速排序)

以下是模拟代码

#include<stdio.h>
#include<windows.h>

void swap(char *p1, char *p2, int size){//按字节交换,只要知道size的大小,对应交换几个字节就好了
	while (size--){
		char temp = *p1;
		*p1 = *p2;
		*p2 = temp;
		p1++; p2++;
	}
}

int  Compar(const void *x, const void *y){//返回值必须是 int 
	int *xp = (int *)x;//强转
	int *yp = (int *)y;
	return (*xp - *yp);//大于的话就返回大于零的数,小于返回负数,等于返回零
}

void Myqsort(void* base, size_t num, size_t size, int(*compar)(const void*, const void*)){
size_t i = 0;//size_t是无符号整数,因为num是无符号数,所以i 和 j 也要定义为无符号数
	for (; i < num - 1; i++){
		size_t j = 0;
		int flag = 0;
		for (; j < num - i - 1; j++){
			if (Compar((char *)base + j*size, (char *)base + (j + 1)*size) >0){//如果前面的大于后面的,就交换.....其余情况不交换(降序相反:只有小于零才交换)
				swap((char *)base + j*size, (char *)base + (j + 1)*size, size);//交换
				flag= 1}
			if(flag == 0){//说明没有发生有效交换,意味着数组已经有序
			break;
			}
		}
	}
}

int main()
{
	int arr[] = { 1, 15, 546, 21, 5, 6, 318, 34, 83, 4148, 97, 4 };
	int size = sizeof(arr) / sizeof(arr[0]);
	Myqsort(arr, size, sizeof(int), Compar);//调用模拟函数
	int i = 0;
	for (; i < size; i++){
		printf("%d ",arr[i]);
	}
	system("pause");
	return 0;
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值