前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >qsort使用

qsort使用

作者头像
发布2024-04-30 21:13:06
710
发布2024-04-30 21:13:06
举报
文章被收录于专栏:转自CSDN转自CSDN

qsort

是用来排序的数据的库函数,底层使用的是快速排序的方式

?排序方式有:选择,冒泡,插入,快速, 希尔......

对于qsort这个库函数:

代码语言:javascript
复制
void qsort(void* base,size_t num,size_t size,int (*compar)(const void*,const void*)

????????其中 void* base 是指针,指向的是待排序的数组的第一个元素,

? ? ? ? num是base指向待排序数组的元素个数 ,

? ? ? ? size是指向的待排序数组的元素的大小.

????????最后的*compar是函数指针,指向的是两个元素的比较函数函数.

? ? ? ? qsort的使用者需要明确指导要拍下吧的是什么数据,这些数据要怎么比较,所以需要提供两个元素的比较函数.

qsort举例

qsort能够排列任意数据

? ? ? ? qsort排列一段整形数据

代码语言:javascript
复制
int cmp_int(const void* n1, const void* n2)
{
	return *(int*)n1 - *(int*)n2;
}

void testone()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{
	testone();
	return 0;
}

? ? ? ? 这个就能实现正序排列

???????? //void* 类型的指针是无具体类型的指针,这种类型的指针不能直接使用,需要转换类型.

? ? ? ? //对于qsort的指针指向的函数的返回类型 是int的类型 分别是大于0 等于0 小于0

????????大于零就是n1指向的元素先于n2指向的元素 ? ? ? ? 等于零就是n1指向的元素等价n2指向的元素 ? ? ? ? 小于零就是n1指向的元素后于n2指向的元素

? ? ? ? 如果要降序就把return的内容反过来就行?

? ? ? ? 用qsort排序结构体数据

? ? ? ? 按照名字排序

代码语言:javascript
复制
struct Stu
{
	char name[20];
	int age;
};
int cmp_struct_name(const void* n1, const void* n2)
{
	return strcmp(((struct Stu*)n1)->name, (*(struct Stu*)n2).name);
}
void testtow()
{
	struct Stu arr[3] =
	{
	{"Alili",10},
	{"Cawdaw",25},
	{"Baa",18}
	};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]),cmp_struct_name);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d\n", arr[i].name,arr[i].age);
	}
}

int main()
{
	testtow();
	return 0;
}

? ? ? ? 需要注意调用结构体的元素时,是利用指针调用(->,这个是间接访问操作符)还是元素调用(.直接访问)

?????????或者结构体中按照年龄比较 只需要把比较函数哪里结合第一个例子改一改就ok

代码语言:javascript
复制
struct Stu
{
	char name[20];
	int age;
};
int cmp_struct_name(const void* n1, const void* n2)
{
	return strcmp(((struct Stu*)n1)->name, (*(struct Stu*)n2).name);
}
int cmp_struct_age(const void* n1, const void* n2)
{
	return ((struct Stu*)n1)->age - (*(struct Stu*)n2).age;
}
void testtow()
{
	struct Stu arr[3] =
	{
	{"Alili",10},
	{"Cawdaw",25},
	{"Baa",18}
	};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]),cmp_struct_age);
	for (int i = 0; i < sz; i++)
	{
		printf("%s %d\n", arr[i].name,arr[i].age);
	}
}

int main()
{
	testtow();
	return 0;
}

qsort的模拟实现

代码语言:javascript
复制
void Swap(char* n1, char* n2,size_t size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *n1;
		*n1 = *n2;
		*n2 = tmp;
		n1++;
		n2++;
	}
}

void my_bubble_sort(void* base, size_t sz,size_t size,int (*cmp)(const void * p1, const void* p2))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1; j++)
		{
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
			{
				Swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
			}
		}
	}
}
  
void tests()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	my_bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{ 
	tests();
	return 0;
}

?????????注意到为什么用char* 来接收 因为char能一个字节一个字节的访问,利用size的宽度可以访问任意长度的类型,因此可以排序各种各样的东西.因为具有这样的包容性,所以它也可以排序结构体.

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • qsort
  • qsort举例
  • qsort的模拟实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com