栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言中的qsort()底层逻辑及代码实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言中的qsort()底层逻辑及代码实现

学习过C语言的基础后,我们知道如果要对段数据进行排序,我们可以通过for循环进行冒泡排序或选择排序等,但是呢这就有一个缺陷,这些排序方法只能对单一数据类型进行排序,如果换为其它数据类型那就作废了。那问题来了,我们怎样才能通过一个函数对所有数据类型进行排序呢?这里当然就是我们的qsort()函数啦!我们都知道,在C语言里的数组内存分配是线性的,且是按照十六进制进行储存,也就是储存的一个数字占一个字节也就是4bit,既然所有的数据都是按照这种规则储存,那我们就可以通过指针对内存进行操作,从而对数据进行排序,而因为每一种数据类型占用的空间大小不同,我们就需要转换为char*指针对内存进行逐一操作,且不同同类型的的比较方法不一样,我们就需要自己写一个comper()返回相应的排序规则,同时也需要我们写一个change()的函数,用来交换内存(排序)。

通过上面的思路我们就知道qsort()应有四个参数,qsort(void*arr,int sz,int wide,int(*cmp)(void*e1,void*e2) )第一个参数用于接收任意类型的指针(我们要排序的数据),第二个参数传入整个数据的大小可通过sizeof()函数求得,第三个参数为该数据中每一个数据的大小,第四个也就是一个函数指针,传入我们自己写的排序规则。说白了第二个参数是用来控制我们循环的,第三个是用来找到值,且change的。

下面呢也就到了我们的代码实现阶段:

void my_qsort(void *arr,int sz,int wide,int (*cmp)(void*e1,void*e2))//自定义排序函数
{
	int i, j;
	for(i=0;i 0)//升序,若是小于0即为降序,可根据自己需要经行更改。
//通过j和wide找到每一个数据,若是满足条件就进行更改,cmp()我们的比较函数,需要我们自定义
			{
				change((char*)arr + j * wide, (char*)arr + (j + 1) * wide, wide);//排序
			}//若满足条件就进入change()中通过(char*)强制类型转换,对内存逐一进行交换,从而实现排序
		}
	}
}
void change(char* e1, char* e2, int wide)//排序
{
	int i = 0;
	
		for (i = 0; i < wide; i++)//通过每个char*指针进行一一交换内存数据,控制wide循环
		{
			char cmp = *e1;
			*e1 = *e2;
			*e2 = cmp;
			e1++;
			e2++;

		}
	
}

结果展示,这里我们对结构体中名字排序进行演示:

typedef struct stu
{//结构体的创建和重定义
	int age;
	char name[20];
}x;
int cmp_st_name(const void* e1, const void* e2)//比较结构体中名字进行排序
{
	return strcmp(((x*)e1)->name, ((x*)e2)->name);//通过字符串中的比较函数进行比较
}
int main()
{
	x arr[3] = { {18,"wangliu"},{20,"lisi"},{5,"zhangsan"} };
	int sz3 = sizeof(arr) / sizeof(arr[0]), wide3 = sizeof(arr[0]);
	my_qsort(arr, sz3, wide3, cmp_st_name);//调用自己的mysort函数
	for (int i = 0; i < 3; i++)
	{
		printf("%d:%s   ", (arr+i)->age,(arr+i)->name);
	}
	return 0;
}

 

总结:说了这么多,其实qsort()函数就是对数据的内存进行操作(通过char*指针),从而达到排序的目的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960315.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号