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

目录
  • 使用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 -1 p1<p2
return 0 p1=p2
return 1 p1>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()函数的使用。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言对数组元素进行冒泡排序的实现

    在实际开发中,有很多场景需要我们将数组元素按照从大到小(或者从小到大)的顺序排列,这样在查阅数据时会更加直观,例如: 一个保存了班级学号的数组,排序后更容易分区好学生和坏学生: 一个保存了商品单价的数组,排序后更容易看出它们的性价比. 对数组元素进行排序的方法有很多种,比如冒泡排序.归并排序.选择排序.插入排序.快速排序等,其中最经典最需要掌握的是「冒泡排序」. 以从小到大排序为例,冒泡排序的整体思想是这样的: 从数组头部开始,不断比较相邻的两个元素的大小,让较大的元素逐渐往后移动(交换两个元素

  • C语言中数组排序浅析

    目录 前言 一.插入排序 1.思路 2.具体步骤 3.代码实现 4.复杂度 二.冒泡排序 1.思路 2.具体步骤 3.代码实现 4.复杂度 三.选择排序 1.思路 2.具体步骤 3.代码实现 4.复杂度 四.希尔排序 1.思路 2.具体步骤 3.代码实现 4.复杂度 例题及其解答 题目描述 输入描述 输出描述 示例1 示例2 解答 结语 前言 本文介绍了几种c语言中对乱序数组的排序方式. 具体的内容有: 插入排序: 冒泡排序: 选择排序: 希尔排序: 具体内容详见下文. 一.插入排序 1.思路

  • C语言算法练习之数组元素排序

    目录 一.问题描述 二.算法实例编译环境 三.算法实例实现过程 3.1.包含头文件 3.2.定义宏和声明数组 3.3.声明相关变量 3.4.随机生成十个数字赋值给数组 3.5.输出随机生成的十个数字 3.6.数组从小到大进行排序 3.7.输出数组元素排序好的数字 四.经典算法实例程序 完整代码 4.1.main.h文件 4.2.main.c文件 五.总结 一.问题描述 求数组的排序 问题的描述 如下几点所示 使用rand()库函数随机生成10个1-100之间的数字. 声明数组的大小为10. 随机

  • C语言将数组中元素的数排序输出的相关问题解决

    问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32,  321},则输出这两个能排成的最小数字32132.请给出解决问题的算法,并证明该算法.       思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可.这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba.如果ab < ba,则a < b:如果ab > ba,则a > b:如果ab = ba,则a = b.比较

  • c语言合并两个已排序数组的示例(c语言数组排序)

    问题:将两个已排序数组合并成一个排序数组 这里先不考虑大数据量的情况(在数据量很大时不知大家有什么好的思路或方法?),只做简单数组的处理. 简单代码如下: 说明:之所以把merge函数定义成返回数组长度,是因为后续会有重复数据合并功能的merge版本,考虑到接口一致性. 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <string.h> int merge(int* ar1, int len1, int

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

    目录 使用qsort函数对自定义结构体数组进行排序 结构体 排序函数 总体代码 C语言 qsort()函数详解 1.qsort概念介绍 2.qsort()函数实现(循序渐进式讲解) 3.小结 使用qsort函数对自定义结构体数组进行排序 qsort进行排序的数组存储的不能是结构体的指针,需要是结构体本身. 结构体 struct student{     char* id;     int mark; }arr[4], test0={"0001",80}, test1={"00

  • C语言对结构体数组按照某项规则进行排序的实现过程探究

    目录 前言 一.qsort()函数 二.compare()函数 1.结构体数组 2.整型数组 3.浮点型数组 三.效果图 总结 这是基于qsort()函数进行的简单排序.(附带其他类型的数组使用qsort()进行的排序) 前言 基于qsort()函数进行的排序最有用的莫过于在此对于结构体数组进行排序了.此外,若能结合函数指针,更是能够实现“想降就降,想升就升”的美好局面. 一.qsort()函数 void qsort( void *base, size_t num, size_t width,

  • C语言中调用Swift函数实例详解

    C语言中调用Swift函数实例详解 在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类.在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提.这里我就为大家分享一下如何在C语言中调用Swift函数. 我们首先要知道的是,所有Swift函数都属于闭包.其次,Swift函数的调用约定与

  • c语言中字符串分割函数及实现方法

    1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a

  • C语言中实现itoa函数的实例

    C语言中实现itoa函数的实例 一.原型: char *itoa( int value, char *string,int radix); 二.函数说明: value:欲转换的数据. string:目标字符串的地址. radix:转换后的进制数,可以是10进制.16进制等. 三.函数简单实现: #include <iostream> #include <string> using namespace std; char* My_itoa(int value,char str[],i

  • C语言中随机数rand()函数详解

      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void);   rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(

  • C语言中如何获取函数内成员的值你知道吗

    目录 C语言中如何获取函数内成员的值 通过函数返回值获取函数内部的情况 通过变量降级(传地址)获取函数内部的情况 总结 C语言中如何获取函数内成员的值 引言:函数作为实现 C 程序功能模块的主要载体,可以将功能的实现细节封装在函数内部.这对于实现模块化的编程带来了便利,让指定功能的复用性也变得更好.但“封装”除带来上述好处外,也导致访问函数内部细节的不太方便,为了了解函数内部的情况,我们讨论如何对函数进行拆包,即获取函数内部的信息. 通过函数返回值获取函数内部的情况 int get_the_va

  • 在PHP语言中使用JSON和将json还原成数组的方法

    在之前我写过php返回json数据简单实例,刚刚上网,突然发现一篇文章,也是介绍json的,还挺详细,值得参考.内容如下 从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() <?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); echo json_encode($arr); ?> 输出 {"a&

  • C语言结构体数组的定义和使用详解

    目录 介绍 结构体数组定义时初始化 补充 介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这时就要使用数组.结构体中也有数组,称为结构体数组.它与前面讲的数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项. 定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组.或者说同前面介绍的普通数组

  • C语言结构体数组常用的三种赋值方法(包含字符串)

    目录 一.按照成员变量进行赋值(麻烦,好理解,字符串赋值需要strcpy) 二.对数组整体进行赋值.(一次性需要把所有的都添加进去,不需要strcpy) (1) 在声明数组的时候,进行赋值 (2)对有规律的数据赋值,比如学生结构体的学号是有规律的. 三.使用输入进行赋值 总结 一.按照成员变量进行赋值(麻烦,好理解,字符串赋值需要strcpy) 这里使用了一个Init函数,为了在进一步说明传参的使用.实际上赋值按照需要放在主函数就行. (使用strcpy函数需要添加头文件string.h) #i

随机推荐