C语言 | qsort()函数使用

 目录:

1.qsort介绍

2.使⽤qsort函数 排序 整型数据 

3.使⽤qsort函数 排序 结构体数据 

4. qsort函数的模拟实现冒泡排序


  qsort()函数 是一个 C语言编译器函数库自带的排序函数, 它可以对指定数组(包括字符串,二维数组,结构体等)进行排序。

头文件:<stdlib.h>

qsort函数原型

void qsort(void *base, //指针,指向的是待排序的数组的第一个元素size_t num, //是base指向的待排序数组的元素个数size_t size, //base指向的待排序数组的元素的大小(字节数)int (*compar)(const void *, const void *) //函数指针);

compar参数是qsort函数排序的核心内容,它指向一个比较两个元素的函数,注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。 

c39b2110e80d4138bdb0629bf17a5fbe.png

如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面 。如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不变 。如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面 。

因此,如果想让qsort()进行从小到大(升序)排序, 那么一个通用的compar函数可以写成这样:

int compare (const void * a, const void * b){if ( *(MyType*)a <  *(MyType*)b )return -1;if ( *(MyType*)a == *(MyType*)b )return 0;if ( *(MyType*)a >  *(MyType*)b ) return 1;}

如果你要将MyType换成实际数组元素的类型。 可以:

//升序排序int compare (const void * a, const void * b){return ( *(int*)a - *(int*)b );//强制类型转换后,进行访问}//降序排列int compare (const void * a, const void * b){return ( *(int*)b - *(int*)a );}

1.使⽤qsort函数 排序整型数据 

a3ef828da6394f96aeda8051a007741c.png

2.使⽤qsort排序 结构体数据 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu //学⽣
{char name[20];//名字int age;//年龄
};//假设按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//结构体变量.成员名
//结构体指针->成员名//假设按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的//是按照对应字符串中字符的ASCII码值比较的//按照年龄来排序
void test2()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}//按照名字来排序
void test3()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}int main()
{test2();//按照年龄来排序test3();//按照名字来排序return 0;
}

3. qsort函数的模拟实现冒泡排序

使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式) 

#include <stdio.h>int int_cmp(const void * p1, const void * p2)
{return (*( int *)p1 - *(int *) p2);
}void swap(void *p1, void * p2, int size)
//交换两个元素//void*的指针 是无具体类型的指针
{                             //作用是接收任何类型的地址  int i = 0;for (i = 0; i< size; i++){char tmp = *((char *)p1 + i);*(( char *)p1 + i) = *((char *) p2 + i);*(( char *)p2 + i) = tmp;}
}
void bubble(void *base, int count , int size, int(*cmp )(void *, void *))
{int i = 0;int j = 0;for (i = 0; i< count - 1; i++){for (j = 0; j<count-i-1; j++){                            //实现升序看 是否>0 是否进行交换if (cmp ((char *) base + j*size , (char *)base + (j + 1)*size) > 0){       //相当于冒泡排序中的arr[j]与arr[j+1]swap(( char *)base + j*size, (char *)base + (j + 1)*size, size);}}}
}int main(){int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i = 0;bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);//自制冒泡排序for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++){printf( "%d ", arr[i]);//实现升序排列}printf("\n");return 0;
}

分享到这里,感谢观看

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/576319.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux离线安装jenkins及使用教程

本教程采用jenkins.war的方式离线安装部署&#xff0c;在线下载的方式会遇到诸多问题&#xff0c;不宜采用 一、下载地址 地址&#xff1a;Jenkins download and deployment 下载最新的长期支持版 由于jenkins使用java开发的&#xff0c;所以需要安装的linux服务器装有jdk环…

samba实现linux共享文件夹

一、samba安装 sudo apt install samba 二、配置Samba 编辑Samba配置文件sudo vi /etc/samba/smb.conf 在文件末尾添加以下内容&#xff0c;设置一个简单的共享目录&#xff08;替换path_to_share为实际的共享目录路径&#xff09;&#xff1a; [Share] path /path_to_sha…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(十二): 聚酰亚胺PI纤维的优点

聚酰亚胺PI纤维的优点 聚酰亚胺PI纤维具有多种显著的优点&#xff1a; 耐高温性能&#xff1a;高温稳定性&#xff0c;聚酰亚胺PI纤维在高温环境下具有出色的稳定性&#xff0c;能够在高温下保持其物理和化学性质&#xff0c;热稳定性优异&#xff0c;可在-269℃&#xff5e;…

深度学习每周学习总结P3(天气识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 数据链接 提取码&#xff1a;o3ix 目录 0. 总结1. 数据导入部分数据导入部分代码详解&#xff1a;a. 数据读取部分a.1 提问&#xff1a;关…

【unity】如何汉化unity编译器

在【unity】如何汉化unity Hub这篇文章中&#xff0c;我们已经完成了unity Hub的汉化&#xff0c;现在让我们对unity Hub安装的编译器也进行下汉化处理。 第一步&#xff1a;在unity Hub软件左侧栏目中点击安装&#xff0c;选择需要汉化的编译器&#xff0c;再点击设置图片按钮…

猫咪冻干可以天天喂吗?推荐四大营养突出的宝藏主食冻干

近年来&#xff0c;冻干猫粮因其高品质而备受喜爱&#xff0c;吸引了无数猫主人的目光。像我这样的资深养猫人早已开始选择冻干喂养。但对于新手来说&#xff0c;他们可能会感到困惑&#xff1a;冻干到底是什么&#xff1f;猫咪冻干可以天天喂吗&#xff1f; 一、冻干到底是什么…

Unity | 射线检测及EventSystem总结

目录 一、知识概述 1.Input.mousePosition 2.Camera.ScreenToWorldPoint 3.Camera.ScreenPointToRay 4.Physics2D.Raycast 二、射线相关 1.3D&#xff08;包括UI&#xff09;、射线与ScreenPointToRay 2.3D&#xff08;包括UI&#xff09;、射线与ScreenToWorldPoint …

经纬恒润RTaW-Pegase:车载网络通信建模与时间特性分析工具

▎RTaW简介 RTaW-Pegase是由法国国家信息与自动化研究所&#xff08;INRIA&#xff09;旗下的RTaW公司开发的产品。它主要用于构建和优化汽车、航空航天以及工业领域的通信网络&#xff0c;包括时间敏感网络&#xff08;TSN&#xff09;、CAN&#xff08;FD&#xff0c;XL&…

Mac电脑怎么录屏?两大神器拯救你的录制需求

mac电脑作为苹果公司推出的一款备受欢迎的计算机设备&#xff0c;拥有出色的性能和简洁的设计。很多时候&#xff0c;我们需要在mac电脑上录制屏幕&#xff0c;以便制作教程、分享游戏过程或者保存重要信息。可是很多用户不知道mac电脑怎么录屏。本文将介绍两种在mac电脑上进行…

github拉取的项目添加至自己的仓库

想把GitHub的开源项目拉到本地进行二开&#xff0c;研究了一下上传到gitee的步骤&#xff1a; 步骤 gitee新建仓库&#xff0c;仓库名与本地文件夹的名称一致&#xff0c;建好后gitee的页面也会有显示git命令 打开项目目录&#xff0c;右键打开git bash&#xff08;或者在git…

Vue 03 组件通信

Vue学习 Vue 0301 浏览器本地存储localStorageSessionStorage案例 todolist的完善 02 组件自定义事件Custom Events基本使用解绑自定义事件注意事项①② 总结案例 todolist的完善 03 全局事件总线GlobalEventBus案例 todolist的完善 04 消息的订阅与发布案例 todolist的完善 05…

抽象类和接口以及Object类

抽象类 在面对对象的概念中&#xff0c;所有对象的创建都是通过类来创建的。但是并不是所有的类都会创建对应的对象。如果一个类中没有足够的数据创建一个对象&#xff0c;这样的类就是抽象类。 如同经常使用的Animal动物类&#xff0c;Dog类&#xff0c;Cat类&#xff0c;Do…