目录
1>>前言
2>>qsort函数的实现
2.1>>什么时qsort函数?
2.2>>qsort函数的格式是什么?
2.3>>qsort函数的解析
2.4>>qsort函数的实现!
3>>结语
1>>前言
今天我会继续分享一些我做的笔记,以及我对指针的理解, 后续会持续分享指针几天,毕竟指针的内容太多了,一天我也学不完,也分享不完,感谢大家理解,希望我的文章对大家有所帮助,谢谢!
2>>qsort函数的实现
2.1>>什么时qsort函数?
qsort函数是一个排序函数,可以排序任意类型的数组,使用qsort需要包含头文件<stdlib.h>,这是我至今为止学的最难理解的知识点,希望大家有所准备,我们一起学习它!
2.2>>qsort函数的格式是什么?
qsort(数组首元素地址,数组元素个数,数组每个元素的大小,int(*p)(const void* e1,const void* e2))
这里的e1和e2指的是数组的两两相邻元素!p是可以自己取名的函数指针!
2.3>>qsort函数的解析
既然知道格式是qsort(数组首元素地址,数组元素个数,数组每个元素的大小,int(*p)(const void* e1,const void* e2))的,那么怎么实现排序的呢?其实是通过e1和e2的比较来实现的,如果e1比e2大,那么函数指针p则返回大于0的值,如果e1等于e2,那么函数指针p则返回一个等于0的值,如果e1小于e2,那么函数指针p则返回一个小于0的值。
多说无益,实践才是王道,我们来看看它是怎么实现的就理解啦!
2.4>>qsort函数的实现!
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* e1,const void* e2)
{
return *(int*)e1-*(int*)e2;
}
int main ()
{
int arr[10]={1,4,3,2,7,6,5,10,9,8};
int sz=sizeof(arr)/sizeof(arr[0]);
int i=0;
for (i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
qsort(arr,sz,sizeof(arr[0]),cmp);
printf("\n");
for (i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
我们写一个乱序的数组arr,sz记录arr内有多少个元素,先打印看看原来的数组,然后使用qsort函数进行排序,在之前我们讲到过在sizeof和&以外,数组名就是数组首元素地址,所以qsort第一个逗号内容就写arr,接着写元素个数sz,再接着写每个元素大小,使用sizeof计算任意一个元素的大小就好,接着到最最最最最重要的函数指针,将第四个逗号的内容写一个函数地址,用来传递
在这里实现接收,记住格式要一样,为什么要使用void*无类型指针呢,因为这样可以强制类型转换成我们需要的类型,在return返回值时,我们讲过如果e1比e2大,那么函数指针p则返回大于0的值,如果e1等于e2,那么函数指针p则返回一个等于0的值,如果e1小于e2,那么函数指针p则返回一个小于0的值。那么此时我们可以简化一下上面的内容,将强制类型转换后的e1解引用完减e2,这样如果e1大返回的就是大于0 的值,e1小就返回小于0 的值,相等就返回等于0 的值,这下就简单许多。
上面是整形数组的例子,一个肯定不能说明qsort函数的妙用,接下来是一个结构体类型的例子:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
char name[20];
int age;
};
int cmp_age(const void* e1,const void* e2)
{
return (*(struct Stu*)e1).age-(*(struct Stu*)e2).age;
}
int main ()
{
struct Stu s[3]={{"zhangsan",20},{"lisi",28},{"wangwu",25}};
int sz=sizeof(s)/sizeof(s[0]);
int i=0;
for (i=0;i<sz;i++)
{
printf("%d ",s[i].age);
}
qsort(s,sz,sizeof(s[0]),cmp_age);
printf("\n");
for (i=0;i<sz;i++)
{
printf("%d ",s[i].age);
}
return 0;
}
结构体咱们以学生为模板,就含两个元素:姓名和年龄。过程大家都懂就不过多赘述了,需要注意的就是需要转变类型为struct Stu* 也就是结构体类型。
若要对姓名进行排序就要使用strcmp函数,来比较两个字符串:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
char name[20];
int age;
};
int cmp_name(const void* e1,const void* e2)
{
return strcmp((*(struct Stu*)e1).name,(*(struct Stu*)e2).name);
}
int main ()
{
struct Stu s[3]={{"zhangsan",20},{"lisi",28},{"wangwu",25}};
int sz=sizeof(s)/sizeof(s[0]);
int i=0;
for (i=0;i<sz;i++)
{
printf("%s ",s[i].name);
}
qsort(s,sz,sizeof(s[0]),cmp_name);
printf("\n");
for (i=0;i<sz;i++)
{
printf("%s ",s[i].name);
}
return 0;
}
strcmp比较也是一样的,如果字符串1比字符串2大,那么则返回大于0的值,如果字符串1等于字符串2,那么则返回一个等于0的值,如果字符串1小于字符串2,那么则返回一个小于0的值。
3>>结语
今天的内容主要是围绕qsort排序函数展开的,大家如果感兴趣可以试着自己写一个能实现任意类型函数的排序,也就是自己写一个qsort。今天学习笔记和分享就到这里啦,谢谢观看!期待下篇与你的相见!