对任意类型数都可以排序的函数:qsort函数

之前我们学习过冒泡排序:

int main()
{int arr[] = { 9,7,8,6,5,4,3,2,1,0 };int sz = sizeof(arr)/sizeof(arr[0]);int i = 0;for (i = 0; i < sz-1; i++) {int j = 0;for (j = 0; j < sz-1-i; j++) {if (arr[j] > arr[j + 1]){int temp = 0;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for (i = 0; i < sz; i++){printf("%d", arr[i]);}return 0;
}

可以看出这样的排序方法只适用于整形类型的数
那么是否有一种排序可以满足所有类型都适用的排序呢?

qsort函数排序
在这里插入图片描述
应用:
在这里需要补充一下void* 类型的指针
在这里插入图片描述

void in_mp(const void* p1, const void* p2)
{return(*(int*) p1 - *(int*)p2);
}
void print(int arr[], int sz)
{int i = 0; for (i = 0; i < sz; i++){printf("%d", arr[i]);}
}
void test1()
{int arr[] = { 9,6,7,8,5,3,4,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), in_mp);print(arr ,sz);
}
int main()
{test1();return 0;}

在这里插入图片描述
当然qsort函数排序既然可以实现任意类型,那么我们换几个类型试一下;
结构体类型

struct stu
{char name[20];int age;
};
void com_in(const void* p1, const void* p2)
{return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d ",arr[i].name, arr[i].age);}
}
void test2()
{struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), com_in);print(arr, sz);
}
int main()
{test2();return 0;
}

在这里插入图片描述
用冒泡排序的思想实现一个功能类似于qsort函数的排序
首先我们先讲一下qsort函数的原理
在这里插入图片描述
然后我们用冒泡排序的思想来改造

所以我们要自己创造一个qsort排序函数就要自己写一个可以排序任意类型数据的函数
我们用冒泡排序的思想来改造,就要解决一下问题

问题一
在这里插入图片描述
解决后:
在这里插入图片描述

问题2
在这里插入图片描述
解决:
在这里插入图片描述
代码:

//测试整形类型的的排序
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d", arr[i]);}
}
int in_mp(const void* p1, const void* p2)
{return(*(int*)p1 - *(int*)p2);}
tmp(char* put1, char* put2, int size)
{int i = 0;int temp = 0;for (i = 0; i < size; i++){temp = *put1;*put1 = *put2;*put2 = temp;put1++;put2++;}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - 1 - i; j++){//把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) {//交换tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);}}}
}
void test1()
{int arr[] = { 9,7,8,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bobble_sort(arr,sz,sizeof(arr[0]),in_mp);print(arr, sz);
}
int main()
{test1();return 0;
}

也可以测试结构体类型

tmp(char* put1, char* put2, int size)
{int i = 0;int temp = 0;for (i = 0; i < size; i++){temp = *put1;*put1 = *put2;*put2 = temp;put1++;put2++;}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - 1 - i; j++){//把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) {//交换tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);}}}
}//void test1()
//{
//	int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bobble_sort(arr,sz,sizeof(arr[0]),in_mp);
//	print(arr, sz);
//}
struct stu
{char name[20];int age;
};int com_in(const void* p1, const void* p2)
{return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d ", arr[i].name, arr[i].age);}
}
void test2()
{struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };int sz = sizeof(arr) / sizeof(arr[0]);bobble_sort(arr, sz, sizeof(arr[0]), com_in);print(arr, sz);
}
int main()
{test2();return 0;
}

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

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

相关文章

Java通过文件流和文件地址下载文件

通过文件流下载文件 如何使用 MultipartFile 进行文件上传、下载到本地&#xff0c;并返回保存路径呢&#xff1a; import org.springframework.web.multipart.MultipartFile;import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOExcep…

laravel框架中批量更新数据

在php框架中 tp中就有批量更新封装好的 SaveAll 在laravel中有批量插入没有批量更新操作;因此我们可以自己去封装一个 然后批量进行更新操作 封装参考代码: /*** 批量更新** param $tableName 表名称* param string $pk 更新的字段* param array $multipleData 要更新的数据*…

多智能体共识算法的粗略数学证明

这篇文章是对论文《Consensus and Cooperation in Networked Multi-Agent Systems》中定理一的粗略数学证明。 论文中的定理一&#xff1a; 对一个由 n 个智能体以拓扑结构 G 组成的网络&#xff0c;使用以下共识算法&#xff1a; x ˙ i ( t ) Σ j ∈ N i a i j ( x j ( t…

【BEV】3D视觉 PRELIMINARY

这里的知识来自于论文 Delving into the Devils of Bird’s-eye-view Perception: A Review, Evaluation and Recipe 的 Appendix B.1 部分来自 这篇文章 从透视图转向鸟瞰图。&#xff08;Xw、Yw、Zw&#xff09;、&#xff08;Xc、Yc、Zc&#xff09;表示世界World坐标和相…

React - useEffect函数的理解和使用

文章目录 一&#xff0c;useEffect描述二&#xff0c;它的执行时机三&#xff0c;useEffect分情况使用1&#xff0c;不写第二个参数 说明监测所有state&#xff0c;其中一个变化就会触发此函数2&#xff0c;第二个参数如果是[]空数组&#xff0c;说明谁也不监测3&#xff0c;第…

Word 2019打开.doc文档后图片和公式不显示(呈现为白框)的解决办法

Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法 目录 Word 2019打开.doc文档后图片和公式不显示&#xff08;呈现为白框&#xff09;的解决办法一、问题描述二、解决方法1.打开 WORD 2019&#xff0c;点击菜单中的“文件”&#xff1b;…

无服务器架构发布啦!

导读Serverless 1.15.2 已发布。The Serverless Framework (无服务器架构&#xff09;允许你自动扩展、按执行付费、将事件驱动的功能部署到任何云。 目前支持 AWS Lambda、Apache OpenWhisk、Microsoft Azure&#xff0c;并且正在扩展以支持其他云提供商。 Serverless 降低了…

iOS-砸壳篇(两种砸壳方式)

CrackerXI砸壳呢&#xff0c;当时你要是使用 frida-ios-dump 也是可以的&#xff1b; https://github.com/AloneMonkey/frida-ios-dump frida-ios-dump: 代码中需要更改的&#xff1a;手机中的内网ip 密码 等 最后放到我的砸壳路径里&#xff1a; python dump.py -l查看应用…

uniapp 自定义手机顶部状态栏不生效问题

想要的效果想淘宝一样&#xff0c;底色覆盖到手机顶部&#xff0c;找了两天都没找到原因&#xff0c;过程很艰苦&#xff0c;直接上结果吧 项目是后来接手的&#xff0c;最终原因出在这&#xff0c; "immersed" : false>设置为 true 就可以了&#xff0c;沉浸式样…

每日一题——合并二叉树

题目 已知两颗二叉树&#xff0c;将它们合并成一颗二叉树。合并规则是&#xff1a;都存在的结点&#xff0c;就将结点值加起来&#xff0c;否则空的位置就由另一个树的结点来代替。例如&#xff1a; 两颗二叉树是: Tree 1 Tree 2 合并后的树为 数据范围&#xff1a;树上节点数…

【1572. 矩阵对角线元素的和】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3]…

docker基本使用方法

docker使用 1. Docker 介绍 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。Docker 使您能够将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。通过利用 …