当前位置: 首页 > news >正文

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的宽度可以访问任意长度的类型,因此可以排序各种各样的东西.因为具有这样的包容性,所以它也可以排序结构体.

        

相关文章:

  • 数据库-第二/三章 关系数据库和标准语言SQL【期末复习|考研复习】
  • Springboot+vue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目
  • 微信小程序自制动态导航栏
  • GNER: 生成式实体识别的新 SoTA
  • 数据结构实现-线性表
  • Javaweb之SpringBootWeb案例之自动配置的原理分析的详细解析
  • Flink基本原理 + WebUI说明 + 常见问题分析
  • element-plus表格合并
  • C 基本语法
  • C#双向链表实现:Append()方法追加并显示数据
  • 【k8s管理--两种方式安装prometheus】
  • 【Linux杂货铺】调试工具gdb的使用
  • 基于ZYNQ的PCIE高速数据采集卡的设计(一)
  • 【UE 材质】冰冻效果
  • 【风格迁移】StyTr2:引入 Transformer 解决 CNN 在长距离依赖性处理不足和细节丢失问题
  • [NodeJS] 关于Buffer
  • 【Leetcode】104. 二叉树的最大深度
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angularjs之国际化
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Create React App 使用
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS字符串转数字方法总结
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • node-glob通配符
  • React+TypeScript入门
  • 闭包,sync使用细节
  • 从零开始的无人驾驶 1
  • 第十八天-企业应用架构模式-基本模式
  • 分布式事物理论与实践
  • 关于extract.autodesk.io的一些说明
  • 机器学习学习笔记一
  • 力扣(LeetCode)56
  • 面试遇到的一些题
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​插件化DPI在商用WIFI中的价值
  • ​人工智能书单(数学基础篇)
  • # 计算机视觉入门
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (十三)Maven插件解析运行机制
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)树状数组
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net Core 中间件验签
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .Net6 Api Swagger配置
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NetCore项目nginx发布
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [AutoSar NVM] 存储架构
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C#]手把手教你打造Socket的TCP通讯连接(一)