【C语言】qsort 函数的详细介绍

🦄个人主页:-雷阵雨-

⚙️作环境:Visual Studio 2022


一:qsort()函数的基本信息和功能

在日常生活中总会遇到一些需要排序的问题,比如商品价格的比较,将身高从高到低需要排序,按照首字母的顺序排序........那么怎么根据电脑的某种程序可以完成这写问题的排序?

 接下来给大家展示一下在C语言函数库中可以使用一个排序的函数,qsort()函数

 先解释一下qsort()的定义:qsort()函数是C语言库函数中的一种排序函数,排序方法是快速排序(quick sort)。特点就是可以排序任何类型的数组元素。

1.1:qsoprt()函数原型

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

这个是qsort()函数的原型,需要引用的头文件:<stdlib>

1.2:函数参数介绍

1:void* base  

  qsort ()函数需要的第一个参数是数组的首元素的地址,void* 是一个无类型的指针,是希望我们可以排序很多数据类型。

 2:size_t num 

  qsort ()函数需要的第二个参数是待排数组元素个数。因为元素个数为非负数,使用数据类型为size_t(无符号整型)。

 计算数组元素个数我们常用的函数是sizeof,即数组元素个数=数组总长度/数组首元素的长度;如下:

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

这样我们就可以求出数组长度。

 3:size_t size 

 一个元素的大小,单位是字节

  qsort ()函数需要的第三个参数是待排数组每个元素的长度。计算每个元素的长度也是使用sizeof;如:

int sz = sizeof(arr[0])

这样单个元素的长度就出来了。

4:int (*compar)(const void*,const void*) 

 函数指针类型,也算测试函数,这个函数指针指向的函数,能够比较指向数组中两个元素。比较函数。

 1.compar()函数的作用仅仅是比较两个参数的大小,然后通过返回值的形式告诉我们qsort()函数两个参数比较的结果,在运行期间是不能更改参数的指,所以我们为了保险,给了两个参数加上了const修饰,参数的数值无法改变。

 小知识点:const修饰的指针,在*左右表示的的意义不同,在*左边即为固定指向的指不发生变化,在*右边即指针指向的方向不发生改变。可以简记:左定值,右定向

 compar()函数编写样式:

最最最重要,也是我在编写是犯糊涂了: 

注意:在这个compare()函数是你自己定义的,在qsort()函数中是你自己在定义这个函数,自己在compare()这个函数中编写测试代码,就是大于0,等于0,小于0然后返回值传给qsort()函数,进行排序。

当接收到compare()返回值的是一个有符号在整型数字,当接收compare返回值大于零时,qsort()函数就会将这两个元素进行交换,反正如果小于0就是不交换。

int cmp_int(const void* p1, const void* p2)
{
	return (*(int*) p1) - (*(int* )p2);
}

因此我们在cmp_int函数可以这样来判断,返回值在零的那一侧,这样的是升序,如果需要降序可以将p1和p2进行调换。

给大家解释一下这个代码 p1就是参数,int*就是类型,然后大括号外面*是解引用。

 小知识点:void*类型指针:可以接受任何类型的地址,但是不能对其进行解引用操作,和不能对其进行加减整数的操作。

下面随便列举一些常用的compare()比较函数:

1:对一维数组进行排序

int cmp_int(const void* p1, const void* p2)
{
	return (*(int*) p1) - (*(int* )p2);
}

 2:对二维数组进行排序

int cmp_int(const void* p1, const void* p2)
{
	return ((int*) p1)[0] - ((int* )p2)[0];
}

 3:对字符串进行排序

int cmp_int(const void* p1, const void* p2)
{
	return strcmp(*(char*)p1,*(char*)p2);
}

 4:对结构体中某个关键字进行排序

先创建个结构体

typedef  struct
{
	char name[20];
	int age;
}stu;

对学生姓名排序

int cmp_int_grade(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->name - ((struct stu*)p2)->name;
}

对学生成绩排序

int cmp_int_grade(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->grade- ((struct stu*)p2)->grade;
}
void test2()
{
	struct stu arr[] = { {"zhnagsan",66},{"lisi",90},{"wamhwu",65} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int_grade);
}

 二:qsort()函数使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//void qsort(void* base,
//	       size_t num,
//	       size_t size,
//	       int (*cmp)(const void*,const void*)
//           )
struct stu
{ 
	char name[20];
	int grade;
};

int cmp_int_grade(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->grade- ((struct stu*)p2)->grade;
}
int cmp_int_grade(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->name - ((struct stu*)p2)->name;
}
void test2()
{
	struct stu arr[] = { {"zhnagsan",66},{"lisi",90},{"wamhwu",65} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int_grade);
}
//int arr[10] = { 9,0,7,8,2,3,4,6,5,1 };
//int cmp_int(const void* p1, const void* p2)
//{
//	return (*(int*) p1) - (*(int* )p2);
//}
//int cmp_int(const void* p1, const void* p2)
//{
//	return strcmp(*(char*)p1,*(char*)p2);
//}
//test(){
//
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, sz, sizeof(arr[0]), cmp_int);
//
//}
//int print()
//{
//	int i = 0;
//	for (i = 0; i <= 9; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
int main()
{
	//test();
	//print();
	test2();
	return 0;
}

这就是全部函数有兴趣可以去做一些,简单的排序。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值