排序函数之qsort
函数
qsort函数是
stdlib.h
库中的一个库函数,可以用于对数组,字符,字符串等排序,并且其时间复杂度为0
qsort
函数具备高效性(时间复杂度为0),广泛性(可对多种类型进行排序)
函数原型
void qsort(void* base,size_t number,size_t type,int (*cmp)(const void*p1,const void*p2)
base
—数组首元素的地址number
—数组中的元素个数type
—数组中元素类型的大小(以字节为单位)cmp
—函数指针,该函数用于比较两元素大小:- 若返回值大于零,则前一个元素大于后一个元素
- 若返回值等于零,则前一个元素等于后一个元素
- 若返回值小于零,则前一个元素小于后一个元素
size_t 表示无符号整数类型
如何用qsort
函数对数组进行排序呢?
由上面对函数原型的解析我们知道,
qsort
函数中,前三个参数都可以直接提供,但是最后一个参数-----函数指针需要我们自己实现
#include<stdio.h>
#include<stdlib.h>
int cmp(const void*, const void*);
int main()
{
int arr[] = { 0,3,1,5,6,7,2,9,8,4 };
int sz = sizeof(arr) / sizeof(arr[0]); //求arr数组中元素个数
qsort(arr, sz, sizeof(int), cmp);
for (int i = 0; i < sz; i++)
printf("%d ", arr[i]);
return 0;
}
int cmp(const void* p1, const void* p2)
{
//这里需要注意,void*指针是无法直接进行指针运算的
//需要先将其转换为我们需要的变量类型,然后对其解引用操作,才能得到数组两元素的差值,所以此处我们应该将其转换为int*类型
return (*(int*)p1 - *(int*)p2);
}
既然可以实现对数组的排序,那么应该如何实现对字符串的排序呢?
同样,我们所需要改变的也是第四个参数—函数指针
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp(const void*,const void*);
int main()
{
char s1[10]="apple";
char s2[10]="orange";
char s3[10]="banana";
char *s[3]={s1,s2,s3}; //储存数组可以使用指针数组
int sz=sizeof(s)/sizeof(s[0]);
qsort(s,sz,sizeof(char*),cmp);
for(int i=0;i<sz;i++)
printf("%s\n",s[i]);
return 0;
}
int cmp(const void* p1,const void*p2)
{
//对于字符串,我们是无法直接比较大小的,我们需要借助strcmp函数
//同时,我们知道在对字符串数组进行排序时,数组的元素是指向字符串的指针,对指针的指针操作我们需要使用到二级指针
return strcmp(*(char **)p1,*(char **p2));
}
虽然
void
指针变量无法直接进行指针运算,但是其对与实现代码的通用性与广泛性有很大贡献