qsort()排序函数 ,今个写冒泡被小姑娘笑话,快23年了居然还有人要自己写排序函数吗。。。被小姑娘教育,学会这个,以后不用再自己写排序函数了,直接调用

目录

❄️一、什么是qsort函数?

      qsort里边需要的四个参数

       void*base:

      num:

      size:

       cmp:

❄️二、基本的参数介绍完毕,那么如何用?

      1.测试整数数据排序

      2.测试结构体按名字排序

     3.测试结构体按年龄排序

三、注意:


前言:兄弟们,福利我的动力源泉在这呢~

吸粉狂魔小姑娘,祝我访问量破千

qsort()排序函数 ,今个写冒泡被小姑娘笑话,快23年了居然还有人要自己写排序函数吗。。。被小姑娘教育,学会这个,以后不用再自己写排序函数了,直接调用_第1张图片

一、什么是qsort函数?

排序我们已经见过很多了有冒泡排序,插入排序,选择排序,堆排序,快速排序·····而qsort运用的就是快速排序来实现的。

直接运用这个函数的话既可以很方便的对各种类型数据进行排序

qsort---C语言标准库提供的排序函数 ,需要引入头文件(#include)

//int (*cmp)(const void*e1,const void* e2)
qsort(void*base,num,size,cmp);

 qsort里边需要的四个参数

base:传进去数据的起始地址

num:待排序的元素个数 

size:数组中一个元素的大小

int (*cmp)(const void*,const void*)比较两个元素大小的函数指针

void*base:

它代表的是要排序的序列首元素的地址

这个对于数组来说传进去的就是数组名比如想要排序arr[10]里边的元素直接在第一个位置传arr

num:

这个代表的意义是需要排序的数据的个数,一般用sizeof(数组名)/sizeof(数组中某个元素)求得

size:

因为不知道传进去的是什么类型元素,所以需要传进去元素内存的大小,sizeof(数组中某个元素)

cmp:

这是个比较函数,用于比较传进去的整形呀字符呀或者结构体元素的大小,这个需要我们自己去写这个函数,然后调用。

这里说一下比如a和b比较,a>b的话需要这个函数返回一个大于0的数,a==b则需要返回0,a

二、基本的参数介绍完毕,那么如何用?

1.测试整数数据排序

需要我们写的函数只有一个,就是比较函数cmp

int cmp_int(const void* e1,const  void* e2)
{
	return *(int*)e1 - *(int*)e2;
}//这里做差,恰好符合函数的定义,大于的话返回大于0的数。。。。。

之后我们把需要排序的数据做出来

void print1(int* arr, int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 4,2,6,8,3,4,1,10,9,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, arr[0], cmp_int);//代入各个数据
	print1(arr, sz);
	return 0;
}

 因为需要打印出来观察结果,所以就写了一个print1函数,下边是测试结果

qsort()排序函数 ,今个写冒泡被小姑娘笑话,快23年了居然还有人要自己写排序函数吗。。。被小姑娘教育,学会这个,以后不用再自己写排序函数了,直接调用_第2张图片

 完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int cmp_int(const char* e1,const  char* e2)
{
	return *(int*)e1 - *(int*)e2;//因为传进去的是空类型,现在传进去的是int类型,所以需要强制类型转换成int类型,加个(int*)
}
void print1(int* arr, int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 4,2,6,8,3,4,1,10,9,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, arr[0], cmp_int);
	print1(arr, sz);
	return 0;
}

2.测试结构体按名字排序

先写tmp函数,这里我们是根据名字比较的,所以这个tmp函数需要用到strcmp()函数来比较

int cmp_stu_by_name(const void* e1, const void* e2)//用于比较名字的函数,因为是字符串,所以需要字符串函数
{
	return strcmp( ((stu*)e1)->name, ((stu*)e2)->name);//因为传进去的是空类型,现在传进去的是结构体类型,所以需要强制类型转换成结构体类型,加个(stu*)
}

 之后把需要测试的数据写出来,因为结构体打印不方便,我这里用的是调试来观察是否排序,下边是完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include

typedef struct stu//定义一个结构体,这个定义要在最前边
{
	char name[20];
	int age;
}stu;
int cmp_stu_by_name(const void* e1, const void* e2)//用于比较名字的函数,因为是字符串,所以需要字符串函数
{
	return strcmp( ((stu*)e1)->name, ((stu*)e2)->name);
}

int  main() 
{
	
	   stu  stu1[] = { {"zhangsan",34},{"lisi",56},{"wangwu",44} };
	int sz = sizeof(stu1) / sizeof(stu1[0]);
	qsort(stu1, sz, sizeof(stu1[0]), cmp_stu_by_name);
	return 0;
}

运行之后可以看出,第一张是进入排序函数前的结果,第二张是排序后的结果,可以看出的确排序了。 

qsort()排序函数 ,今个写冒泡被小姑娘笑话,快23年了居然还有人要自己写排序函数吗。。。被小姑娘教育,学会这个,以后不用再自己写排序函数了,直接调用_第3张图片

qsort()排序函数 ,今个写冒泡被小姑娘笑话,快23年了居然还有人要自己写排序函数吗。。。被小姑娘教育,学会这个,以后不用再自己写排序函数了,直接调用_第4张图片

3.测试结构体按年龄排序

因为年龄是整数,这个比较函数cmp跟整数的大差不差

int cmp_stu_by_age(const void* e1, const void* e2)//用于比较年龄的函数
{
  	return ((stu*)e1)->age-((stu*)e2)->age;
 }

 下边是测试的数据,可以看出第一张是原始数据,第二张是排序后的年龄。

qsort()排序函数 ,今个写冒泡被小姑娘笑话,快23年了居然还有人要自己写排序函数吗。。。被小姑娘教育,学会这个,以后不用再自己写排序函数了,直接调用_第5张图片

qsort()排序函数 ,今个写冒泡被小姑娘笑话,快23年了居然还有人要自己写排序函数吗。。。被小姑娘教育,学会这个,以后不用再自己写排序函数了,直接调用_第6张图片

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include

typedef struct stu//定义一个结构体,这个定义要在最前边
{
	char name[20];
	int age;
}stu;
int cmp_stu_by_name(const void* e1, const void* e2)//用于比较名字的函数,因为是字符串,所以需要字符串函数
{
	return strcmp( ((stu*)e1)->name, ((stu*)e2)->name);
}
int cmp_stu_by_age(const void* e1, const void* e2)
{
  	return ((stu*)e1)->age-((stu*)e2)->age;
 }
int  main() 
     {
	
   	   stu  stu1[] = { {"zhangsan",34},{"lisi",56},{"wangwu",44} };
	int sz = sizeof(stu1) / sizeof(stu1[0]);
 	qsort(stu1, sz, sizeof(stu1[0]), cmp_stu_by_age);
     	return 0;
}

 里边包含了第一个测试

三、注意:

每次传进去的第四个参数比较函数是不同的,结构体的定义需要在最前边才可以运用,另外这个底层用的排序函数用的是快排。

下一文我会用我们熟悉的冒泡函数来实现这个排序函数。

码文不易,各位阔以三连嘛~~~

你可能感兴趣的:(C语言进阶,算法,数据结构,c++)