C语言----qsort函数讲解以及实现

 🌞各位看官:欢迎来到(每日小知识)

🌟建议订阅专栏--> 每日小知识

🌟也欢迎关注小编--> 小峰同学

赶快上🚌跟着小编每天进步一点点,开心学习每一天。

😘如果觉得小编的文章对你有帮助,可以一键三连支持小编

😍你的支持才是小编最大的动力

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5bOw5ZCM5a2mJiYm,size_6,color_FFFFFF,t_70,g_se,x_16

👻本期重点:qsort函数讲解以及实现

函数的介绍:

先看函数的本体:

解析:

qsort是一个库zhejisu函数,头文件是<stdlib.h>。功能是执行快速排序。这个qsort对任意类型的数据都能排序,功能很强大。

图中我们可以看到qsort的四个参数,

void qsort( void *base, //待排序数组的起始位置,也就是首元素地址

size_t num, //数组的元素个数

size_t width,//一个元素的字节大小
 
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );//
//这是一个函数地址
//com是一个比较函数elem1 是 elem2是待比较的两个元素的地址。

说了这么就久肯定又不懂的地方,我直接演示一个最简单的用法吧:


#include<stdlib.h>
#include<stdio.h>

//判断函数
//判断qsort函数怎么排序
int com(const void* e1, const void* e2)
{
	return *(int*)e1 -* (int*)e2;//默认大于0就是升序
}

int main()
{
	int arr[10] = { 0,1,4,7,3,9,6,2,5,8 };

	int sz = sizeof(arr) / sizeof(arr[0]);

	qsort(arr, sz, sizeof(arr[0]), &com);//注意头文件<stdlib.h>
        //arr数组的起始位置
		//sz数组的元素个数
		//sizeof(arr[0])每个元素的字节大小。
		//&com判断函数的地址,
 

	//打印结果
	for (int i = 0; i < 10; i++)
	{
		printf("%d", arr[i]);
	}

	return 0;
}

观察上面的一个简单的应用是不是就明白一点了。我们再训练一个难一点点的:

#include<stdio.h>
#include<stdlib.h>

//声明结构体
typedef struct sss
{
	char name[20];
	char sex[20];
	int age;
	char id[20];
	char tele[20];

}sss;



#include<string.h>

int com(void* e1, void* e2)
{

	//按年龄排  小-->大
	return ((sss*)e1)->age - ((sss*)e2)->age;

	按名字首字母排
	//return strcmp(((sss*)e1)->name, ((sss*)e2)->name);

	//按地址的首字母排
	//return strcmp(((sss*)e1)->id, ((sss*)e2)->id);
}


int main()
{
    //创建结构体数组并赋值
	sss arr[4] = { {"zhangshan","nan",12,"beijing","32311232"},{"lisi","nan",19,"tianjing","5432876"},{"wangwu","nv",17,"wuhan","15571022065"},{"guoliu","nv",22,"jiaxing","1234567654"}};

	int sz = sizeof(arr) / sizeof(arr[0]);
    //函数的运用
	qsort(arr, sz, sizeof(arr[0]), &com);


    //打印结果
	for (int i = 0; i < sz; i++)
	{

		printf("name:%-20s  sex:%-20s  age:%-20d  id:%-20s  tele:%-20s", arr[i].name, arr[i].sex, arr[i].age, arr[i].id, arr[i].tele);
		printf("\n");

	}





	return 0;
}

我相信你看完 , 对qsort函数有了一个全新的认识了 。

模拟实现qsort

查看资料  我们知道,qsort的函数本体是:

void qsort( void *base, //待排序数组的起始位置,也就是首元素地址

size_t num, //数组的元素个数

size_t width,//一个元素的字节大小
 
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );//
//这是一个函数地址
//com是一个比较函数elem1 是 elem2是待比较的两个元素的地址。
  • 返回值是void
  • 四个参数
  • 功能是排序

具体的实现:

//交换任意数据,需要指定数据的大小
void reverse(char* left, char* right, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		char mid = *left;
		*left = *right;
		*right = mid;
		left++;
		right++;
	}

}

//void* 是为了保证能接收任意
void my_qsort(void* str, int num, int sz, int (*com)(void*e1,void*e2))//int (*)(void*e1,void*e2)函数指针类型
{
	//趟数
	for (int i = 0; i < num - 1; i++)
	{
		//每一趟比较实现
		for (int j = 0; j < num-i-1; j++)
		{
			//运用com判断函数判断是否,需要交换。
			if (com((char*)str + j * sz, (char*)str + (j + 1) * sz) > 0)
			{
				//交换函数
				reverse((char*)str + j * sz, (char*)str + (j + 1) * sz, sz);

			}
		}
	}
}

这就是具体函数内部的模仿使用。

今天就讲到这里,感谢各位看官!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小峰同学&&&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值