qsort函数的使用
www.cpluscplus.com打开链接查看qsort函数的定义。
1、现在我们来认识下这个函数,这个函数是对数组元素进行排序
void qsort (void* base, size_t num, size_t size,
int (compar)(const void,const void*));
(1)void* base:空指针指向数组的起始地址
(2)size_t num:要排序元素的个数,类型为无符号整形
(3)size_t size:要排序元素在内存中占多少个字节,无符号整形类型
(4)最后一个形式参数为函数指针,指向了一个函数,它有俩个参数都为常量空指针,返回类型为整形。函数的作用是为了比较排序数组中俩个元素的大小,如果要排序数组的类型是int型,则这个函数的目的就是实现比较俩个int型的大小,返回一个>0、<0、=0的结果。
2、大概了解了函数的意思,我们通过一个例子来用下这个qsort函数
下面展示将一个整形数组进行排序`。
#include <stdio.h>
//用qsort函数用相应的头文件
#include <stdlib.h>
void print(int arr[], int sz)
{
int i = 0;
for(i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int cmp_int(const void* e1, const void* e2)
{
//e1为void*指针,我们使用必须转化为int*
return (*((int*)e1) - *((int*)e2));
}
int main()
{
//定义一个要排序的整形数组
int arr[] = {9,8,7,6,5,4,3,2,1};
int sz = sizeof(arr)/sizeof(arr[0]);//39/4
//打印数组
printf("排序之前:\n");
print(arr,sz);
//用qsort进行排序
qsort(arr, sz, sizeof(arr[0]), cmp_int);
//打印数组
printf("排序之后:\n");
print(arr,sz);
return 0;
}
3、最近在练习一个通讯录的代码,里面有一个排序的功能。接下来我们来看一个对结构体类型的排序
下面展示一些 内联代码片
。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//引入qsort函数的头文件
#include <stdlib.h>
//自定义一个结构体类型存放个人信息
typedef struct PeoInfo
{
char name[10];
int age;
}PeoInfo;
void print(PeoInfo* data, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s ",data[i].name);
printf("%d\n", data[i].age);
}
}
int cmp_name(const void* e1, const void* e2)
{
return strcmp((*(PeoInfo*)e1).name, (*(PeoInfo*)e2).name);
}
int cmp_age(const void* e1, const void* e2)
{
return (*(PeoInfo*)e1).age - (*(PeoInfo*)e2).age;
}
//对结构体类型进行排序
int main()
{
//初始化个人信息
PeoInfo data[3] = {"zhangsan",15,"wangwu",10,"lisi",5};
int sz = sizeof(data)/sizeof(data[0]);
//打印信息
printf("原始信息:\n");
print(data, sz);
printf("按姓名排序:\n");
qsort(data, sz, sizeof(data[0]), cmp_name);
print(data, sz);
printf("按年龄排序:\n");
qsort(data, sz, sizeof(data[0]), cmp_age);
print(data, sz);
return 0;
}