🌞各位看官:欢迎来到(每日小知识)
🌟建议订阅专栏--> 每日小知识
🌟也欢迎关注小编--> 小峰同学
赶快上🚌跟着小编每天进步一点点,开心学习每一天。
😘如果觉得小编的文章对你有帮助,可以一键三连支持小编
😍你的支持才是小编最大的动力
👻本期重点: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);
}
}
}
}
这就是具体函数内部的模仿使用。