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

 更新时间:2022年11月11日 11:41:16   作者:东方旅行者  
这篇文章主要介绍了C语言中使用qsort函数对自定义结构体数组进行排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用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语言应用领域分析

    C语言应用领域分析

    在本篇文章里小编给各位分享的是关于C语言应用领域分析内容,有兴趣的朋友们可以学习下。
    2020-03-03
  • C++浅析序列数据封装与优化实现方法

    C++浅析序列数据封装与优化实现方法

    封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全,数据封装是一种把数据和操作数据的函数捆绑在一起的机制,数据抽象是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制
    2022-12-12
  • 一文详解C语言中文件相关函数的使用

    一文详解C语言中文件相关函数的使用

    这篇文章主要为大家详细介绍了C语言中文件相关函数的使用,可以实现文件的读写、打开和关闭。文中通过示例进行了详细介绍,需要的可以参考一下
    2022-07-07
  • Qt实现密码框

    Qt实现密码框

    这篇文章主要为大家详细介绍了Qt实现密码框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++基于文件流与armadillo读取mnist示例详解

    C++基于文件流与armadillo读取mnist示例详解

    这篇文章主要给大家介绍了关于C++基于文件流与armadillo读取mnist的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 获取当前系统本地时间,精确到毫秒的实例

    获取当前系统本地时间,精确到毫秒的实例

    下面小编就为大家带来一篇获取当前系统本地时间,精确到毫秒的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 使用VC++实现打印乘法口诀表

    使用VC++实现打印乘法口诀表

    本文给大家分享的是一个超级简单的小例子,使用vc++打印乘法口诀表,给需要的小伙伴参考下吧。
    2015-03-03
  • C语言回溯法解八皇后问题(八皇后算法)

    C语言回溯法解八皇后问题(八皇后算法)

    这篇文章介绍了C语言回溯法解八皇后问题,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C语言运算符与表达式

    C语言运算符与表达式

    这篇文章主要介绍了C语言运算符与表达式,表达式是C语言的主体。在C语言中,表达式由操作符和操作数组成,更多相关介绍需要的小伙伴可以参考下面文章内容
    2022-07-07
  • Clion下vcpkg的使用详解

    Clion下vcpkg的使用详解

    这篇文章主要介绍了Clion下vcpkg的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04

最新评论