既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
🐌 个人主页:蜗牛牛啊
🔥 系列专栏:🛹初出茅庐C语言、🛴数据结构
📕 学习格言:博观而约取,厚积而薄发
🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同成长! 🌹
文章目录
一、qsort函数简介
qsort函数是由C语言提供的标准库函数, 它的实现思想是快速排序,qosrt函数的头文件是stdlib.h。
qsort函数可以排序任意类型的数组。它的返回类型是void
,参数是(void* base,size_t num,size_t size,int(*compar)(const void* e1,const void* e2))
。
接下来对它的参数进行分析:
参数void* base
中base
是void*
类型的指针,base
指向待排序数组的第一个元素的地址,也就是指向数组的起始位置。
参数size_t num
中size_t表示的是无符号整型,num
表示的是待排序数组中总的元素个数。
参数size_t size
中size
表示的是待排序数组中每个元素占几个字节。
参数int (*compar)(const void* e1, const void* e2)
是函数指针,int
表示指向函数的返回类型是int类型,compar
表示的是函数指针变量,指向函数的地址,被指向的函数用于比较两个元素的大小。
在参数int (*compar)(const void* e1, const void* e2)
中,函数指针变量compar
指向的函数返回类型是int
,返回值的大小可以分为三种情况:
返回值 | 条件 |
---|---|
>0 | e1>e2 |
<0 | e1<e2 |
=0 | e1=e2 |
二、qsort函数的使用
1.整型数组排序
#include <stdio.h>
#include <stdlib.h>
int cmp\_int(const void\* e1, const void\* e2)
{
return \*((int\*)e1) - \*((int\*)e2);//默认是升序,将return中e1和e2的位置交换可以使其降序
//无法对void\*类型的指针进行具体操作,因此要将其强制类型转换为int\*,使其能够在解引用时访问到4个字节
}
int main()
{
int i = 0;
int arr[] = { 7,8,9,4,5,6,1,2,3,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//计算整型数组中有多少个元素
qsort(arr, sz, sizeof(int), cmp_int);//sizeof(int)是用来计算int类型的数据所占字节数
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);//输出为1 2 3 4 5 6 7 8 9 10
}
return 0;
}
注意:当函数的形参为void*
类型,要对其进行具体操作时,应该将其强制类型转换为所需的指针类型
2.字符串排序
#include <stdio.h>
#include <stdlib.h>
int cmp\_char(const void\* e1, const void\* e2)//字符串排序
{
return strcmp((char\*)e1, (char\*)e2);//比较字符大小用strcmp
}
int main()
{
char arr[] = "badecf";
int i = 0;
//int sz = sizeof(arr) / sizeof(arr[0]);//sizeof求字符串长度会将\0算进去,也就是实际计算出来的会比数组中的多1。
int sz = strlen(arr);//strlen是用来计算字符串长度的,且只能用来计算字符串的长度。
qsort(arr,sz , sizeof(char), cmp_char);
printf("%s\n", arr);//abcdef
return 0;
}
3.字符串长度排序
#include <stdio.h>
#include <stdlib.h>
int cmp\_char\_strlen(const void\* e1, const void\* e2)//比较字符串长度
{
return strlen(\*(char\*\*)e1) - strlen(\*(char\*\*)e2);//先将e1和e2强制类型转换成为char\*\*类型,再解引用取出数组中字符串的地址,计算字符串长度
}
int main()
{
//char\* arr[] = {"abcdef" "abc","defs" };
//也可以通过下面的方式来写指针数组,下面的4行和上面的这一行作用一样
char\* arr1 = "abc";
char\* arr2 = "abcd";
char\* arr3 = "abcdef";
char\* arr[] = { arr1,arr2,arr3 };
int i = 0;
qsort(arr, 3, sizeof(char\*), cmp_char_strlen);
for (i = 0; i < 3; i++)
{
printf("%s\n", arr[i]);//输出结果为 abc defs abcdef
}
return 0;
}
4.浮点型数组排序
#include <stdio.h>
#include <stdlib.h>
int cmp\_float(const void\* e1, const void\* e2)//浮点型数组排序
{
//return (int)(\*(float\*)e1 - \*(float\*)e2);//可能会出错,如12.002和12.001比较之后再强制类型转换为int类型后,结果为0
if (\*(float\*)e1 - \*(float\*)e2 > 0.000000)
{
return 1;//当e1>e2时,返回大于0的数
}
if (\*(float\*)e1 - \*(float\*)e2 < 0.000000)
{
return -1;//当e1<e2时,返回小于0的数
}
else
return 0;//当e1和e2相等时,返回等于0的数
}
int main()
{
float arr[3] = { 12.01f,12.03f,12.09f };
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组长度
qsort(arr, sz, sizeof(float), cmp_float);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%f ", arr[i]);//输出结果为12.010000 12.030000 12.090000
}
return 0;
}
5.结构体类型排序
#include <stdio.h>
#include <stdlib.h>
struct stu
{
char name[20];
int age;
};
int cmp\_s\_age(const void\* e1, const void\* e2)//比较结构体中int类型
{
return ((struct stu\*)e1)->age - ((struct stu\*)e2)->age;
}
int cmp\_s\_name(const void\* e1, const void\* e2)//比较结构体中char类型的数组
{
return strcmp(((struct stu\*)e1)->name, ((struct stu\*)e2)->name);
}
int main()
{
struct stu s[] = { {"zhangsan",21} ,{"lisi",20},{"wangwu",52}};
int i = 0;
int sz = sizeof(s) / sizeof(s[0]);
for (i = 0; i < sz; i++)
{
printf("%s %d\n", s[i].name, s[i].age);
}
qsort(s, sz, sizeof(struct stu), cmp_s_age);//比较年龄,即比较int类型
//qsort(s, sz, sizeof(struct stu), cmp\_s\_name);//比较姓名,即比较char类型的数组
printf("\n");
for (i = 0; i < sz; i++)
{
printf("%s %d\n", s[i].name, s[i].age);//输出为年龄按照升序排列,如果比较姓名,则按照姓名的首字符的ASCII值按照升序排列
}
return 0;
}
三、冒泡排序实现qsort函数的功能
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
g-8ZzlBLdw-1715850621550)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新