🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》
⛺️生活的理想,就是为了理想的生活!
🌈hello! 各位宝子们大家好啊,刚开始学编程的时候我们都是用冒泡来进行排序的,今天给大家介绍一下新的排序方法库函数qsort! ⛳️sor英文原意是排序的意思,而qsort的q是quick的缩写快速的意思!那么库函数qsort的意思就不言而喻了吧?快速排序! 📚本期文章收录在《C语言初阶篇》 ,大家有兴趣可以看看呐! ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!
🌈在介绍库函数qsort之前我们先来回顾下冒泡排序。
📚 代码演示:
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;
//趟数
for (i = 0; i < sz - 1; i++)
{
//一趟比较
//两两相邻元素比较
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
🔥 但是:冒泡排序只能排序整数,像浮点数、字符、结构体都排序不了!
⛳️ 而我们的库函数qsort就不一样了,所有数据类型都可以排序这点是不是比冒泡排序强太多了?我们先来看看在C语言官网上qsort的描述。
✅ 大部分人肯看到这个参数可能就会想怎么这么复杂?其实没有什么难的我们来一起看一下慢慢来你就会彻底明白这些是什么意思?
这就就是我们暂时获得的信息,而我们知道要调用函数得给它传值那么接下来,就来研究一下啊,qsort函数的参数
上面是C语言官网上对qsort的四个参数描述,看起来很复杂是吧其实非常简单我们来把函数原型写出来对照一下,看下每个参数的含义是什么:
void qsort(void* base, //指向了需要排序的数组的第一个元素
size_t num, //排序的元素个数
size_t size,//一个元素的大小,单位是字节
int (*cmp)(const void*, const void*)
//函数指针类型 - 这个函数指针指向的函数,能够比较base指向数组中的两个元素
);
📑 看下一下官方文档中的参数描述:
是什么意思:
⛳️ 这里说指向要排序的的第一对象的指针转为, void* 空指针类型
📑 看下一下官方文档中的参数描述:
⛳️ 这里意思是:base指向的数组空间里元素的个数, size_t 是一个无符号整形的数!
🔥 注:我们知道无符号整数没有符号位,所以它永远表示的都是正数。而元素个数也都是正数不能是负数所以这里会转换为size_t类型。
📑 看下一下官方文档中的参数描述:
⛳️ 这里意思是:base指向的数组里每元素的大小, size_t 是一个无符号整形的数!
🔥 注:和前面一样,数据类型的大小也永远是正数,所以我们把它转换为size_t类型是不是合适些!
📑 看下一下官方文档中的参数描述:
⛳️ 这里意思是:参数四需要一个函数指针类型的参数,做为比较函数传给它!
也就是我们需要自己写一个比较函数然后把地址传给参数四 int compar (const void* p1, const void* p2);
这个函数需要完成的功能是
void我们都知道是一个空类型的意思,void 就是无类型的指针 :*
+ -
是该跳过多少字节呢?📚示例一:
⛳️这里就就可以看出一旦指针类型不同是不可以接收不同类型的地址的!
void*
类型的指针就不会出现这种情况📚示例二:
⛳️前面说了这种指针既不能直接解引用,又不能进行指针运算那么我们该怎么使用void*类型的指针呢?
📑图片展示:
⛳️好了各位宝子们!前面的知识我们掌握就可以来实践一下这个库函数是不是真的有那么神奇,相信很多人已经迫不及待了吧!
📚 代码演示:
#include <stdio.h>
#include <stdlib.h>
int compar(const void* p1,const void* p2)
{
return (*((int*)p1) - *((int*)p2));
}
void print(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 8,6,9,7,6,1,2,4,5,3,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
//排序
qsort(arr, sz, sizeof(arr[0]), compar);
//打印
print(arr, sz);
return 0;
}
这里我们就进行了整形数组排序,前三个参数很简单就不讲:
那么我们就造一个比较函数出来就行
📑 代码结果:
⛳️同理字符前面三个参数也一样就比较函数需要改动,而字符的比较直接用strcmp这个函数就可以了!
📚 代码演示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compar(const void* p1,const void* p2)
{
return strcmp((char*)p1,(char*)p2);
}
void print(char* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%c ", arr[i]);
}
}
int main()
{
char arr[] = { 'c','a','f','d','B','A','C','D'};
int sz = sizeof(arr) / sizeof(arr[0]);
//排序
qsort(arr, sz, sizeof(arr[0]), compar);
//打印
print(arr, sz);
return 0;
}
📑 代码结果:
⛳️同理字符前面三个参数也一样就比较函数需要改动,而字符的比较直接用strcmp这个函数就可以了!
📚 代码演示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{
char arr[20];
int age;
};
int compar_by_age(const void* p1,const void* p2)
{
return (((struct Stu*)p1)->age-((struct Stu*)p2)->age);
}
int main()
{
struct Stu arr[] = { {"zhangsan",30},{"lisi",70},{"wangwu",10} };
int sz = sizeof(arr) / sizeof(arr[0]);
//排序
qsort(arr, sz, sizeof(arr[0]), compar_by_age);
return 0;
}
📑 代码结果:
✅ 归纳:
好了以上就是关于 库函数 qsort 快速排序函数 的用法就全部讲解完毕啦!
库函数 qsort的介绍
库函数 qsort 参数一
库函数 qsort 参数二
库函数 qsort参数三
库函数 qsort参数四
库函数 qsort的应用
☁️ 把本章的内容全部掌握,铁汁们就可以熟练应用qsort排序各种各样的数据啦!
看到这里了还不给博主扣个:
⛳️ 点赞
☀️收藏
⭐️ 关注
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。