qsort使用

qsort

是用来排序的数据的库函数,底层使用的是快速排序的方式

 排序方式有:选择,冒泡,插入,快速, 希尔......

对于qsort这个库函数:

void qsort(void* base,size_t num,size_t size,int (*compar)(const void*,const void*)

        其中 void* base 是指针,指向的是待排序的数组的第一个元素,

        num是base指向待排序数组的元素个数 ,

        size是指向的待排序数组的元素的大小.

        最后的*compar是函数指针,指向的是两个元素的比较函数函数.

        qsort的使用者需要明确指导要拍下吧的是什么数据,这些数据要怎么比较,所以需要提供两个元素的比较函数.

qsort举例

qsort能够排列任意数据

        qsort排列一段整形数据

int cmp_int(const void* n1, const void* n2)
{return *(int*)n1 - *(int*)n2;
}void testone()
{int arr[] = { 9,8,7,6,5,4,3,2,1 };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()
{testone();return 0;
}

        这个就能实现正序排列

         //void* 类型的指针是无具体类型的指针,这种类型的指针不能直接使用,需要转换类型.

        //对于qsort的指针指向的函数的返回类型 是int的类型 分别是大于0 等于0 小于0

        大于零就是n1指向的元素先于n2指向的元素

        等于零就是n1指向的元素等价n2指向的元素

        小于零就是n1指向的元素后于n2指向的元素

        如果要降序就把return的内容反过来就行 

        

        用qsort排序结构体数据

        按照名字排序

struct Stu
{char name[20];int age;
};
int cmp_struct_name(const void* n1, const void* n2)
{return strcmp(((struct Stu*)n1)->name, (*(struct Stu*)n2).name);
}
void testtow()
{struct Stu arr[3] ={{"Alili",10},{"Cawdaw",25},{"Baa",18}};int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]),cmp_struct_name);for (int i = 0; i < sz; i++){printf("%s %d\n", arr[i].name,arr[i].age);}
}int main()
{testtow();return 0;
}

        需要注意调用结构体的元素时,是利用指针调用(->,这个是间接访问操作符)还是元素调用(.直接访问)

         或者结构体中按照年龄比较 只需要把比较函数哪里结合第一个例子改一改就ok

struct Stu
{char name[20];int age;
};
int cmp_struct_name(const void* n1, const void* n2)
{return strcmp(((struct Stu*)n1)->name, (*(struct Stu*)n2).name);
}
int cmp_struct_age(const void* n1, const void* n2)
{return ((struct Stu*)n1)->age - (*(struct Stu*)n2).age;
}
void testtow()
{struct Stu arr[3] ={{"Alili",10},{"Cawdaw",25},{"Baa",18}};int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]),cmp_struct_age);for (int i = 0; i < sz; i++){printf("%s %d\n", arr[i].name,arr[i].age);}
}int main()
{testtow();return 0;
}

qsort的模拟实现

void Swap(char* n1, char* n2,size_t size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *n1;*n1 = *n2;*n2 = tmp;n1++;n2++;}
}void my_bubble_sort(void* base, size_t sz,size_t size,int (*cmp)(const void * p1, const void* p2))
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - 1; j++){if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0){Swap((char*)base + j * size, (char*)base + (j + 1) * size,size);}}}
}void tests()
{int arr[] = { 9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);my_bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}
}int main()
{ tests();return 0;
}

         注意到为什么用char* 来接收 因为char能一个字节一个字节的访问,利用size的宽度可以访问任意长度的类型,因此可以排序各种各样的东西.因为具有这样的包容性,所以它也可以排序结构体.

        

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

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

相关文章

Unity 向量计算、欧拉角与四元数转换、输出文本、告警、错误、修改时间、定时器、路径、

using System.Collections; using System.Collections.Generic; using UnityEngine;public class c2 : MonoBehaviour {// 定时器float t1 0;void Start(){// 向量Vector3 v1 new Vector3(0, 0, 2);Vector3 v2 new Vector3(0, 0, 3);// 计算两个向量的夹角Debug.Log(Vector3…

基于java+springboot女士电商平台系统源码+文档设计

基于javaspringboot女士电商平台系统源码文档设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

光伏业务管理软件都有哪些?

随着光伏行业的快速发展&#xff0c;光伏业务管理软件在光伏企业的日常运营和管理中扮演着越来越重要的角色。这些软件不仅提高了光伏企业的运营效率&#xff0c;还帮助企业更好地管理项目、优化资源配置、降低成本并提升市场竞争力。本文将介绍一些常见的光伏业务管理软件&…

41、网络编程/TCP.UDP通信模型练习20240301

一、编写基于TCP的客户端实现以下功能&#xff1a; 通过键盘按键控制机械臂&#xff1a;w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 1.基于TCP服务器的机械臂…

ELK学习

ELK 一、ELK介绍 &#x1f604; “ELK”是三个开源项目的首字母缩写&#xff0c;这三个项目分别是&#xff1a;Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0…

软考重点题解析-基础知识

1.加密技术&#xff1a;分为对称加密技术&#xff1a;文件的加密和解密使用相同的密钥 和 非对称加密技术&#xff1a;加密和解密不同的密钥&#xff0c;分别是公开密钥和私有密钥。 例题&#xff1a;若A,B两人分别在认证机构&#xff08;CA&#xff09;M,N处获得证书&…

每日leetcode--最大数

正题之前 三玖yyds&#xff01;&#xff01;&#xff01; 题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整…

STM32 | J-link安装过程

J-Link是一种由SEGGER公司开发的调试器和仿真器,用于嵌入式系统开发。它可以帮助开发人员在开发过程中进行调试和仿真,提供了快速、稳定的连接,并支持多种不同类型的微处理器和微控制器。 要获取J-Link软件,请访问SEGGER公司的官方网站(www.segger.com)并进入他们的下载…

解决:code ERESOLVE:ERESOLVE could not resolve 的报错问题

报错实例 报错原因 是我执行npm i xxx-xx的时候会出现这个错误 查了资料表示是node.js的问题 或者的依赖本身的问题 解决 1.在后面加上 --legacy-peer-deps 示例&#xff1a;npm i sass-loader7.3.1 --legacy-peer-deps 2&#xff0c;检查node版本&#xff0c;更改node版本 …

Doris——纵腾集团流批一体数仓架构

目录 前言 一、早期架构 二、架构选型 三、新数据架构 3.1 数据中台 3.2 数仓建模 3.3 数据导入 四、实践经验 4.1 准备阶段 4.2 验证阶段 4.3 压测阶段 4.4 上线阶段 4.5 宣导阶段 4.6 运行阶段 4.6.1 Tablet规范问题 4.6.2 集群读写优化 五、总结收益 六…

(Aliyun AI ACP 03)阿里云机器学习平台PAI

文章目录 阿里云人工智能工程师ACP认证考试知识点辅助阅读&#xff08;Aliyun AI ACP 03&#xff09;阿里云机器学习平台PAI引言PAI平台特点与优势阿里云AI产品的特点与应用场景集成解决方案与服务 阿里云人工智能工程师ACP认证考试知识点辅助阅读 &#xff08;Aliyun AI ACP …

Vue2:用node+express写一个轻量级的后端服务

1、桌面创建demo文件夹 进入demo&#xff0c;执行如下命令 npm init输入名称&#xff1a; test_server然后一路回车 2、安装express框架 npm i express3、新建server.js 在demo文件夹中&#xff0c;新建server.js const express require(express) const app express()…