首先,qsort函数是个库函数 那么就有头文件 #include<stdlib.h>
这个函数的实现是利用快速排序的方法实现的
下面是该函数的参数
//void qsort(void* base, //指向了待排序数组的第一个元素
// size_t num, //待排序的元素个数
// size_t size, //每个元素的大小,单位是字节
// int (* cmp)(const void*, const void*) //指向一个函数,这个函数可以比较2个元素的大小
// );
该函数的第四个参数 需要传一个函数指针 也就是地址 这个函数需要实现两个对象之间的比较
那么这个函数具体是怎样使用的呢 下面用代码来展示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>//qsort 库函数头文件
//void qsort(void* base, //指向了待排序数组的第一个元素
// size_t num, //待排序的元素个数
// size_t size, //每个元素的大小,单位是字节
// int (* cmp)(const void*, const void*) //指向一个函数,这个函数可以比较2个元素的大小
// );
int my_cmp(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void Print(int* arr, int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 9,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
Print(arr, sz);
qsort(arr, sz, sizeof(arr[0]),my_cmp);
Print(arr, sz);
return 0;
}
里面有什么不明白的地方 会在后面讲到
这个函数实现的是升序排序 那么降序如何排序呢 也就是在my_cmp函数的返回之前面加上“-”符号
就可以实现降序排列
如果这个函数只能排列 数组之类的东西 那未免也太逊了
他可不可以排列结构体成员呢 当然可以 因为一个函数思想在程序设计当中被反复用到 那么设计师就将这些函数分装成了库函数 那么它可以解决结构体成员之间的排序就理所应当了
struct stu
{
char arr[20];
int age;
};
int my_cmp(const void* p1, const void* p2)
{
return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
int main()
{
struct stu s[] = { {"zhangsan", 30},{"lisi", 20},{"wangwu", 50} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(struct stu), my_cmp);
return 0;
}
运行结果
那姓名怎么排序呢 有没有想到字符串比较函数 他也是个库函数 #include<string.h>头文件
根据字符串的ASCLL值进行比较 如果不太清楚该库函数是怎样比较的 可以查查 这里就不介绍了
下面是如何排序字符串的具体代码
#include<string.h>
int my_cmp(const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->arr, ((struct stu*)p2)->arr);
}
int main()
{
struct stu s[] = { {"zhangsan", 30},{"lisi", 20},{"wangwu", 50} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(struct stu), my_cmp);
return 0;
}
运行结果
如果基本可以掌握qsort库函数的使用 那我们下一张就了解了解它是怎么实现的
我会用冒泡排序来模拟它 你也可以用其他排序来模拟它 反正 换汤不换药 ~