C语言中使用qsort函数对自定义结构体数组进行排序

Rhea ·
更新时间:2024-11-10
· 1014 次阅读

目录

使用qsort函数对自定义结构体数组进行排序

结构体

排序函数

总体代码

C语言 qsort()函数详解

1、qsort概念介绍

2、qsort()函数实现(循序渐进式讲解)

3、小结

使用qsort函数对自定义结构体数组进行排序

qsort进行排序的数组存储的不能是结构体的指针,需要是结构体本身。

结构体 struct student{     char* id;     int mark; }arr[4], test0={"0001",80}, test1={"0002",90}, test2={"0003",60}, test3={"0004",61} ; 排序函数 int cmp(const void *a, const void *b){     int mark1=((struct student *)a)->mark;     int mark2=((struct student *)b)->mark;     return mark1>mark2 ? 1:-1; } 总体代码 #include <stdio.h> struct student{     char* id;     int mark; }arr[4], test0={"0001",80}, test1={"0002",90}, test2={"0003",60}, test3={"0004",61} ; int cmp(const void *a, const void *b){     int mark1=((struct student *)a)->mark;     int mark2=((struct student *)b)->mark;     return mark1>mark2 ? 1:-1; } int main(){     arr[0]=test0;arr[1]=test1;arr[2]=test2;arr[3]=test3;     printf("—————排序前—————\n");     for(int i=0; i<4; i++)         printf("%s %d\n",arr[i].id,arr[i].mark);     qsort(arr,4,sizeof(struct student),cmp);     printf("—————排序后—————\n");     for(int i=0; i<4; i++)         printf("%s %d\n",arr[i].id,arr[i].mark);     return 0; }

结果

—————排序前—————
0001 80
0002 90
0003 60
0004 61
—————排序后—————
0003 60
0004 61
0001 80
0002 90

C语言 qsort()函数详解 1、qsort概念介绍

qsort()函数(quick sort)是八大排序算法中的快速排序,能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型。

2、qsort()函数实现(循序渐进式讲解)

2.1 qsort()函数

qsort()函数函数函数参数:

void qsort  (void* base //待排序数据的起始地址  size_t num, //待排序数据的元素个数  size_t size,//待排序数据中一个元素的大小(单位:字节)  int (*compar)(const void*,const void*)//比较两个元素大小的函数指针 );

函数中第一个函数参数(void)的类型非常奇妙,因为待排序数据的元素类型可能是整形、浮点型、字符型、结构体……而void类型就像一个宰相(宰相肚子能撑船)不管你传过来的地址是何类型,我都可以积极的收纳。

函数中第四个函数参数是最难理解的。对于整形数据我们可以通过大小号来比较,对于字符型数据可以用strcmp来比较,但是,我们遇到结构体就出现了问题,结构体中包含的类型多,我们就需要因材施教。

int (*compar)(const void*p1,const void*p2)//比较两个元素大小的函数指针 );
返回值含义
return -1p1<p2
return 0p1=p2
return 1p1>p2

2.2 qsort()函数实现过程

观察冒牌排序:

可得出如下过程:

整形:

//测试qsort()函数功能 int cmp_int(const void* e1, const void* e2) {     return  *(int*)e1 - *(int*)e2; } void test() {     int arr[] = { 9,8,7,6,5,4,3,2,1,0 };     int sz = sizeof(arr) / sizeof(arr[0]);     qsort(arr, sz, sizeof(arr[0]), cmp_int);     for (int i = 0; i < sz; i++)     {         printf("%d ", arr[i]);//打印排列好的数组     } } int main() {     test();     return 0; }

结构体:

struct Stu {     char name[20] = {0};     int age = 0; }; int cmp_by_name(const void* e1, const void* e2) {     return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); } void test() {     struct Stu s[] = { {"zhangsan",10},{"lishi",20}};     qsort(s, sizeof(s), sizeof(s->name),cmp_by_name);     printf("%s ", s->name); } int main() {     test();     return 0; } 3、小结

有了qsort()函数能有节省不少时间,后期我会出一起通讯录再详细的介绍qsort()函数的使用。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。



结构体数组 c语言中 自定义 结构体 qsort C语言 排序 数组

需要 登录 后方可回复, 如果你还没有账号请 注册新账号