qsort函数介绍
qsort函数介绍:
在使用该函数时,我们要清楚这几点:
1.该函数无返回值,其头文件为#include<stdlib.h>;
2.其四个函数参数分别为:待排序数据中第一个对象的地址,排序数据元素个数,排序数据中每个元素大小,单位为字节,用来比较待排序数据中两个数据的函数;
3.比较函数的返回值必须为int,其参数类型为void类型的指针;
3.qsort函数可用于任何数据类型的排序。
接下来我会举几个例子,让我们更加清楚这个函数的使用。
例一:整型数据的排序
实例代码:
//qsort:快速排序函数--整型数据
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> //printf
#include<stdlib.h> //qsort
int cmp_int(const void* a, const void* b)
//比较整型数据
//存放的将要进行比较的两个函数的地址
{
return (*((int*)a) - *((int*)b));
//(int*)a:强制类型转换为整型指针
//升序排列(从小到大)
//如果a大于b,则返回1;如果a小于b,则返回-1;若相等,则返回0
//return *((int*)b) - *((int*)a);
//降序排列(从大到小)
}
int main()
{
int arr[] = { 40,10,100,90,20,25 };
int sz = sizeof(arr) / sizeof(arr[0]);
int n = 0;
qsort(arr, sz, sizeof(int), cmp_int);
//qsort(数组名,数组内元素个数,数组内每个元素的大小,比较调用)
for (n = 0; n < sz ; n++)
//打印数组内的元素
{
printf("%d ", arr[n]);
}
return 0;
}
复制代码
输出结果(升序):
输出结果(降序):
例二:字符数据的排序
实例代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> //printf
#include<stdlib.h> //qsort
#include<string.h> //strlen
int cmp_char(const void* a, const void* b)
//比较整型数据
//存放的将要进行比较的两个函数的地址
{
return *(char*)a - *(char*)b;
//(char*)a:强制类型转换为字符指针
//升序排列(从小到大)
//如果a的ASCLL值大于b,则返回1;
//如果a的ASCLL值小于b,则返回-1;
//若相等,则返回0
//return *(char*)b - *(char*)a;
//降序排列(从大到小)
}
int main()
{
char arr[] = { 'b','d','c','f','q','o','p' ,'\0'};
//字符数组排序
int len = strlen(arr);
printf("len=%d\n", len);
//字符数组内字符个数
int n = 0;
qsort(arr, len, sizeof(char), cmp_char);
//qsort(数组名,数组内元素个数,数组内每个元素的大小,比较调用)
for (n = 0; n < len; n++)
//打印字符数组中的元素
{
printf("%c ", arr[n]);
}
return 0;
}
复制代码
输出结果(升序):
输出结果(降序):
例三:结构体数据的排序
实例代码:
1:按年龄排序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> //printf
#include<stdlib.h> //qsort
typedef struct Student
{
char name[50]; //姓名
int age; //年龄
}S;
int com_by_age(const void* a, const void* b)
{
return ((S*)a)->age - ((S*)b)->age;
//升序
//按年龄大小排序
//return ((S*)b)->age - ((S*)a)->age;
//降序
}
int main()
{
S s[] = { {"zhangsan",18},{"lisi",21},{"wangwu",20},{"liuqi",17} };
//按年龄大小排序
int n = 0;
int sz = sizeof(s) / sizeof(s[0]);
//数据的个数
qsort(s, sz, sizeof(s[0]), com_by_age);
for (n = 0; n < sz; n++)
//打印结果
{
printf("%s %d\n", s[n].name, s[n].age);
}
return 0;
}
复制代码
输出结果(升序):
输出结果(降序):
2:按名字(ASCLL)排序
按名字排序跟strcmp函数一个道理,如果你忘了strcmp的功能是什么的话,可以点击strcmp查看。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> //printf
#include<stdlib.h> //qsort
#include<string.h> //strcmp
typedef struct Student
{
char name[50]; //姓名
int age; //年龄
}S;
int com_by_name(const void* a, const void* b)
{
return strcmp(((S*)a)->name , ((S*)b)->name);
//升序
//a>b,返回一个正数;a<b,返回一个负数;a=b,返回0;
//return strcmp(((S*)b)->name , ((S*)a)->name);
//降序
}
int main()
{
S s[] = { {"zhangsan",18},{"lisi",21},{"wangwu",20},{"liuqi",17} };
//按名字排序
int n = 0;
int sz = sizeof(s) / sizeof(s[0]);
//数据的个数
qsort(s, sz, sizeof(s[0]), com_by_name);
//按名字排序
for (n = 0; n < sz; n++)
//打印结果
{
printf("%s %d\n", s[n].name, s[n].age);
}
return 0;
}
}
复制代码
输出结果(升序):
输出结果(降序):
本篇内容到这里就结束了,如果你觉得多少对你有点帮助的话,可以点赞或者收藏支持一波,欢迎大佬在评论区批评指正,我们下次再见!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END