c语言qsort函数对结构体的一级排序,sort和qsort函数对结构体的二级排序

qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定)。集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题。所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分。

具体介绍:-^^ void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )

int compare (const void *elem1, const void *elem2 ) );

qsort(即,quicksort)主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。

参数意义如下:

第一个参数 base 是 需要排序的目标数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式)

第二个参数 num 是 参与排序的目标数组元素个数

第三个参数 width 是单个元素的大小(或者目标数组中每一个元素长度),推荐使用sizeof(s[0])这样的表达式

第四个参数 compare 就是让很多人觉得非常困惑的比较函数啦。

我们来简单讨论compare这个比较函数(写成compare是我的个人喜好,你可以随便写成什么,比如 cmp 什么的,在后面我会一直用cmp做解释)。

典型的compare的定义是int compare(const void *a,const void *b);

返回值必须是int,两个参数的类型必须都是const void *,那个a,b是随便写的,个人喜好。假设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,其他的依次类推,后面有例子来说明对不同的类型如何进行排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有如下结构体: ```c struct student{ char name[20]; int age; float score; }; ``` 可以通过以下代码使用 `qsort` 函数结构体数组 `students` 按照分数从高到低进行排序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> struct student{ char name[20]; int age; float score; }; int cmp(const void *a, const void *b); int main() { struct student students[5] = {{"Tom", 20, 86.5}, {"Jerry", 19, 92.0}, {"Alice", 21, 78.5}, {"Bob", 18, 95.0}, {"Ted", 20, 88.5}}; int i; printf("Before sorting:\n"); for(i = 0; i < 5; i++){ printf("%s, %d, %.1f\n", students[i].name, students[i].age, students[i].score); } qsort(students, 5, sizeof(struct student), cmp); printf("\nAfter sorting:\n"); for(i = 0; i < 5; i++){ printf("%s, %d, %.1f\n", students[i].name, students[i].age, students[i].score); } return 0; } int cmp(const void *a, const void *b) { struct student *s1 = (struct student *)a; struct student *s2 = (struct student *)b; if(s1->score < s2->score){ return 1; } else if(s1->score > s2->score){ return -1; } else{ return 0; } } ``` 其中,`qsort` 函数的参数依次为: - 待排序的数组名 `students` - 数组中元素的个数 `5` - 每个元素的大小 `sizeof(struct student)` - 比较函数 `cmp` `cmp` 函数用于定义两个元素之间的大小关系,返回值为负数表示第一个元素比第二个元素小,返回值为正数表示第一个元素比第二个元素大,返回值为零表示两个元素相等。在本例中,`cmp` 函数按照分数从高到低进行比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值