前言
qsort是C语言的库函数,使用前需包含头文件#include<stdlib.h>,函数原型是
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );它的功能是对不同数据的快速排序
一、参数解释
1.void *base
前言里说到,qsort函数可以对不同数据类型的数据快速排序,因此base接收的是排列元素的首地址,void*可以理解为元素可以是任一类型的指针
2.size_t num
该参数表示排列元素的个数
3.size_t width
表示每个元素所占字节大小
4.int (__cdecl *compare )(const void *elem1, const void *elem2 )
该参数是一个函数指针,指向的是两个函数参数是 const void*类型,返回类型为int的函数,该函数被称为比较函数,该函数只有在返回值大于0时才会置换
比较函数的参数类型和返回类型都是固定的,const void* 中,const保证不会改变传过来的数据,void*则可以接收任一类型的指针,
在使用qsort函数时,比较函数需根据不同类型的数据进行不同的返回设计,在返回值大于0时才会置换
二、void*类型解释
void类型被称为空类型指针,因此它可以接收任一类型的指针,但是void类型的数据无法解引用(不确定类型)和加减操作(不确定所占字节大小)
三、函数的使用
1.整型数据排序
int cmp_int(const void* e1,const void* e2)
{
return (*(int*)e1) - (*(int*)e2);
}
int main(){
int arr[5] = { 5,4,3,2,1 };
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_int);
for (int i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
}
2.结构体整型数据排序
struct Std {
int age;
char name;
int sex;
};
int main
{
struct Std s[3] = { {10,"zs",1},{20,"ls",1},{30,"ww",0} };
qsort(s, sizeof(s)/ sizeof(s[0]), sizeof(s[0]), cmp_struct);
for (int i = 0; i < 3; i++)
{
printf("%d ", s[i].age);
}
}
3.结构体字符数据大小排序
struct Std {标签:const,struct,int,void,qsort,C语言,sizeof,库函数 From: https://blog.51cto.com/u_15466618/6022503
int age;
char name[10];
int sex;
};
int cmp_structchar(const void* e1, const void* e2)
{
return strcmp(((struct Std*)e1)->name, ((struct Std*)e2)->name);
}
int main()
{
struct Std s[3] = { {10,"zss",1},{20,"ls",1},{30,"wssw",0} };
qsort(s, sizeof(s)/ sizeof(s[0]), sizeof(s[0]), cmp_structchar);
for (int i = 0; i < 3; i++)
{
printf("%s ", s[i].name);
}
}