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

编写基于冒泡排序算法的qsort函数

目录

1.简单认识冒泡排序

 2.进入正文分析如何实现函数

3.1比较两个相邻元素的大小

3.2比较两个相邻元素大小后要换函数

4.my_qsort函数:

5.总结:


1.简单认识冒泡排序

冒泡排序的步骤如下:

  • 比较相邻的两个元素,如果第一个元素比第二个元素大(或小),就交换它们的位置。
  • 对每一对相邻的元素重复上述操作,直到数组的末尾。这样,最大(或最小)的元素就被移动到了数组的最后一个位置。
  • 除了最后一个元素外,对剩余的元素重复以上步骤,直到没有任何一对相邻元素需要交换为止
// 冒泡排序
void bubble_sort(int arr[], int len)
{int i, j, temp;for (i = 0; i < len - 1; i++){for (j = 0; j < len - 1 - i; j++){if (arr[j] > arr[j + 1]){temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

 我们可以基于冒泡排序思想对以上代码进行改造成qsort函数对任意数据类型起到排序作用

了解qsort函数可以看下面的网站或者我的另一篇博客

cplusplus网站:https://legacy.cplusplus.com/reference/cstdlib/qsort/?kw=qsort

关于qsort函数的使用博客:qsort库函数的使用_Jamo@的博客-CSDN博客

 2.进入正文分析如何实现函数

我们通过观察冒泡函数可以看出我们在最初给的冒泡函数中只能比较整型数据来进行排序

 在冒泡函数中的第二个for循环中我们通过每一趟冒泡来依次比较两个相邻的元素大小来决定是否交换他们的位置,但如果我们在想要排序的数组中遇到了浮点型数据呢?又或是字符型数据呢?又或是结构体类型数据呢?

显然此时的冒泡函数无法解决我们的燃眉之急。

但我们依然可以借助于冒泡的模板来写出自己的qsort函数来解决问题:

  • 我们发现在排序时我们只是排序的数据类型不一样了,但排序思想任然是冒泡思想,因此我们做出的改变就是对第二个for循环中的比较方法就行改进。

3.1比较两个相邻元素的大小

对于int 类型数据我们可以通过大于小于来直接比较他们的大小来决定是否交换位置

对于所有类型来说我们可以实现一个比较函数来帮我们解决这个问题:

//在比较两个相邻元素大小时,由于不知道跳过元素有多大,因此在处理不确定数据类型排序时,使用char * 类型和原数据类型size大小来找到冒泡排序的下两对元素compar((char*)数据1 , (char*)数据2 )

//基于冒泡排序算法的qsort函数
void bubble_qsort(void* base, size_t num, size_t size, int (*compar)(const void* e1, const void* e2))
{int i = 0;int j = 0;int tmp = 0;for (i = 0; i < num - 1; i++){//为了处理不同数据类型比较方法,此处的排序需要在原来整型数据冒泡排序写法上进行改造for (j = 0; j < num - 1 - i; j++){//在为比较函数compar找两两元素时,由于不知道跳过元素有多大,因此在处理不确定数据类型排序时,使用char * 类型和原数据类型size大小来找到冒泡排序的下两对元素//比如说比较元素是int类型时(char*)base加上循环变量j * int类型大小4找到数组首个元素地址,第二个元素地址便是(cahr*)base加上循环变量(j+1)之后 *4 找到第二个元素地址if (compar((char*)base + j * size, (char*)base + (j + 1) * size) > 0){//交换swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}

 以比较整型数据举例:我们自己使用qsort函数时写出自己想要比较的数据类型的compar函数:

//比较函数
//返回大于0的数字代表前一个元素大于后一个元素
//返回等于0的数字代表前一个元素等于后一个元素
//返回小于0的数字代表前一个元素小于后一个元素
int compar(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}

3.2比较两个相邻元素大小后要换函数

我们通过自己写一个swap函数来解决这一问题;

为什么要自己写交换函数而不用第三个变量来进行两两交换呢?

我们既然是为了写出一个qsort函数比较任意数据类型数据那我们自然也不知道我们将来要交换的元素究竟是什么类型的,自然也无法创建第三个变量来使其两两交换

实现swap函数:

//给swap函数初始化参数与交换函数compar同理
swap((char*)base + j * size, (char*)base + (j + 1) * size, size);//由于不知道交换元素的类型,因此我们决定对相邻两个元素一个字节一个字节进行交换
//将两元素
void swap(char* p1, char* p2, size_t size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *p1;*p1 = *p2;*p2 = tmp;p1++;p2++;}
}

4.my_qsort函数:

//此交换函数原理是对内存中相邻元素一个字节一个字节交换
void swap(char* p1, char* p2, size_t size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *p1;*p1 = *p2;*p2 = tmp;p1++;p2++;}}
//比较函数
//返回大于0的数字代表前一个元素大于后一个元素
//返回等于0的数字代表前一个元素等于后一个元素
//返回小于0的数字代表前一个元素小于后一个元素
int compar(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}//基于冒泡排序算法的qsort函数
void bubble_qsort(void* base, size_t num, size_t size, int (*compar)(const void* e1, const void* e2))
{int i = 0;int j = 0;int tmp = 0;for (i = 0; i < num - 1; i++){//为了处理不同数据类型比较方法,此处的排序需要在原来整型数据冒泡排序写法上进行改造for (j = 0; j < num - 1 - i; j++){//不知道跳过元素有多大,因此在处理不确定数据类型排序时,使用char * 类型和原数据类型size大小来找到冒泡排序的下两对元素//返回大于0的数字代表前一个元素大于后一个元素//返回等于0的数字代表前一个元素等于后一个元素//返回小于0的数字代表前一个元素小于后一个元素if (compar((char*)base + j * size, (char*)base + (j + 1) * size) > 0){//交换swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}
int main()
{int num_arr[10] = { 10,9,8,7,6,5,4,3,2,1 };int sz = sizeof(num_arr) / sizeof(num_arr[0]);printf("原来的顺序:");print_arr(num_arr, sz);bubble_qsort(num_arr, sz, sizeof(num_arr[0]), compar);printf("排序的顺序:");print_arr(num_arr, sz);return 0;
}

5.总结:

实现该函数最主要的部分便是交换函数compar函数参数的书写,如何在不知道元素数据类型的情况下找到元素来进行大小比较,以及如何在不知道元素数据类型的情况下对两个相邻元素来交换。


以上便是全部内容了,感谢大家的支持和鼓励,下次见!

相关文章:

编写基于冒泡排序算法的qsort函数

目录 1.简单认识冒泡排序 2.进入正文分析如何实现函数 3.1比较两个相邻元素的大小 3.2比较两个相邻元素大小后要换函数 4.my_qsort函数&#xff1a; 5.总结&#xff1a; 1.简单认识冒泡排序 冒泡排序的步骤如下&#xff1a; 比较相邻的两个元素&#xff0c;如果第一个元素比…...

有什么推荐使用的企业上网行为管理软件?

在当今信息化社会&#xff0c;企业的上网行为管理越来越重要。企业上网行为软件是一种能够监控和管理企业员工上网行为的工具&#xff0c;它可以帮助企业更好地管理网络资源&#xff0c;提高工作效率&#xff0c;保护企业信息安全&#xff0c;并符合相关的法律法规。本文将深入…...

机器学习第五课--广告点击率预测项目以及特征选择的介绍

这个项目的主要的目的是通过给定的广告信息和用户信息来预测一个广告被点击与否。 如果广告有很大概率被点击就展示广告&#xff0c;如果概率低&#xff0c;就不展示。 因为如果广告没有被点击&#xff0c;对双方&#xff08;广告主、平台&#xff09;来讲都没有好处。所以预测…...

细说tcpdump的妙用

原文地址:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 tcpdump命令最初设计用于观察TCP/IP性能问题&#xff0c;它是一个用于截取网络分组&#xff0c;并输出分组内容的工具。tcpdump可以将网络中传送的数据包的报文头完全截获下来提供分析&#xff0c;它支持针…...

【深度学习实验】前馈神经网络(七):批量加载数据(直接加载数据→定义类封装数据)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 直接加载鸢尾花数据集 a. 加载数据集 b. 数据归一化 c. 洗牌操作 d. 打印数据 2. 定义类封装数据 a. __init__(构造函数&#xff1a;用于初始化数据集对象) b.…...

气体放电模拟装置中1Pa~101kPa范围内的真空度控制技术

摘要&#xff1a;针对微间隙气体放电特性分析中需要对不同真空压力进行精密控制的要求&#xff0c;本文提出了相应的解决方案。解决方案采用了双路调节技术&#xff0c;由真空计、电控针阀和真空压力控制器组成进气和排气控制回路&#xff0c;可实现真空度1Pa~101kPa全量程范围…...

华为OD机试 - 构成正方形的数量 - 数据结构map(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 …...

sql on条件判断是要注意null值

我是因为用了merge into语法&#xff0c;然后on条件中判断的字段是可配置的&#xff0c;这就导致了&#xff0c;有时候判断条件多的情况下&#xff0c;判断的字段会碰到有null值的情况&#xff0c;如果on两边的字段都是null&#xff0c;null和null对比就会导致结果为false&…...

9.22(一):数组扁平化

ES6的flat方法 const arr[1,2,[33,44,5,[6,7]],3]// es6中的flat方法function arr1() { //数组自带的扁平化方法,flat的参数代表的是需要展开几层&#xff0c; //如果是Infinity的话&#xff0c;就是不管嵌套几层&#xff0c;全部都展开return arr.flat(Infinity) } let resul…...

【vue2第十九章】手动修改ESlint错误 和 配置自动化修改ESlint错误

目标:认识代码规范 代码规范:一套写代码的约定规则。例如:“赋值符号的左右是否需要空格”&#xff0c;"一句结束是否是要加;”等 为什么要使用代码规范&#xff1f; 在团队开发时&#xff0c;提高代码的可读性。 在创建项目时&#xff0c;我们选择的就是一套完整的代码…...

计算机网络常见面试题

目录 一、谈一谈对OSI七层模型和TCP/IP四层模型的理解&#xff1f; 答&#xff1a;OSI七层模型主要分为&#xff1a; TCP/IP四层协议&#xff1a; 二、谈谈TCP协议的3次握手过程&#xff1f; 三、TCP协议为什么要3次握手&#xff1f;2次&#xff0c;4次不行吗&#xff1f; …...

springboot整合MeiliSearch轻量级搜索引擎

一、Meilisearch与Easy Search点击进入官网了解&#xff0c;本文主要从小微型公司业务出发&#xff0c;选择meilisearch来作为项目的全文搜索引擎&#xff0c;还可以当成来mongodb来使用。 二、starter封装 1、项目结构展示 2、引入依赖包 <dependencies><dependenc…...

禁用鼠标的侧边按键

新买了个鼠标&#xff0c;整体都不错&#xff0c;就是鼠标左侧有两个按键&#xff0c;大拇指经常无意触碰到&#xff0c;造成误操作。 就想着关闭侧边按键功能。以下这批文章帮了大忙&#xff01; 鼠标侧键屏蔽&#xff0c;再也不用担心按到侧键了。_禁用鼠标侧键_挣扎的蓝藻…...

【C语言】数组和指针刷题练习

指针和数组我们已经学习的差不多了&#xff0c;今天就为大家分享一些指针和数组的常见练习题&#xff0c;还包含许多经典面试题哦&#xff01; 一、求数组长度和大小 普通一维数组 int main() {//一维数组int a[] { 1,2,3,4 };printf("%d\n", sizeof(a));//整个数组…...

2023年中国研究生数学建模竞赛D题解题思路

为了更好的帮助大家第一天选题&#xff0c;这里首先为大家带来D题解题思路&#xff0c;分析对应赛题之后做题阶段可能会遇到的各种难点。 稍后会带来D题的详细解析思路&#xff0c;以及相关的其他版本解题思路 成品论文等资料。 赛题难度评估&#xff1a;A、B>C>E、F&g…...

在编译源码的环境下,搭建起Discuz!社区论坛和WordPress博客的LNMP架构

目录 一.编译安装nginx 二.编译安装MySQL 三.编译安装PHP 四.安装论坛 五.安装wordpress博客 六.yum安装LNMP架构&#xff08;简要过程参考&#xff09; 一.编译安装nginx 1&#xff09;关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下 systemctl stop fire…...

腾讯面试题:无网络环境,如何部署Docker镜像?

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是小米&#xff0c;很高兴再次和大家见面。今天&#xff0c;我要和大家聊聊一个特别有趣的话题——腾讯面试题&#xff1a;无网络环境&#xff0c;如何部署Docker镜像&#xff1f;这可是一个技术含量颇高的问题哦&#xff01;废…...

医学影像信息(PACS)系统软件源码

PACS系统是PictureArchivingandCommunicationSystems的缩写&#xff0c;与临床信息系统&#xff08;ClinicalInformationSystem,CIS&#xff09;、放射学信息系统(RadiologyInformationSystem,RIS)、医院信息系统(HospitalInformationSystem,HIS)、实验室信息系统&#xff08;L…...

【01】FISCOBCOS的系统环境安装

我们选择ubuntu系统 01 https://www.ubuntu.org.cn/global 02 03下载最新版 04等待下载 00提前准备好VM&#xff0c;点击创建新的虚拟机 01选择自定义安装 02一直下一步到 03 04 05其他的默认即可 06 07 08 09 10 11一直默认到下面 12 13等待安装 安装后重启即可…...

flutter 权限和图片权限之前的冲突

权限插件 permission_handler: ^9.2.0想调起相册和视频&#xff0c;这个插件只有Permission.storage.request().&#xff0c;获取存储权限。 问题是android 13的一些手机&#xff0c;系统设置没有存储权限&#xff0c;用了上面这个权限&#xff0c;三次拒绝后就永久拒绝了&…...

一秒推GEO中的DeepSeek收录技巧关键要素是什么?

本文将深入探讨在GEO环境中运用DeepSeek的收录技巧。首先&#xff0c;了解收录的核心要素是必不可少的。这包括优化内容质量&#xff0c;以满足用户需求。接着&#xff0c;合理配置关键词&#xff0c;确保它们自然流入标题与段落&#xff0c;提高搜索引擎识别度。此外&#xff…...

Spring Boot 3.x 集成 AI 智能体实战

Spring Boot 3.x 集成 AI 智能体实战 本文介绍如何使用 Spring Boot 3.x 构建 AI 智能体应用&#xff0c;涵盖核心概念和详细实战步骤&#xff0c;帮助开发者快速上手智能体开发。 核心概念 Spring Boot 3.x&#xff1a;最新的 Spring Boot 版本&#xff0c;支持现代化开发特性…...

TCL发布会解析:Q9M Pro领衔,T7M系列双星登场,163吋Micro LED双曜压轴

3月17日&#xff0c;“当技术站上巅峰 普惠才有力量”2026 TCL SQD-Mini LED电视春季新品发布会隆重举行&#xff0c;TCL重磅推出Q9M Pro、T7M Pro、T7M Ultra、Max163M Pro、Max163M等一系列王炸级电视新品。其中&#xff0c;Q9M Pro、T7M Pro以及T7M Ultra系列的上市&#xf…...

终极指南:如何突破K9s权限壁垒,轻松解决受限环境下的资源跳转难题

终极指南&#xff1a;如何突破K9s权限壁垒&#xff0c;轻松解决受限环境下的资源跳转难题 【免费下载链接】k9s &#x1f436; Kubernetes CLI To Manage Your Clusters In Style! 项目地址: https://gitcode.com/GitHub_Trending/k9s/k9s K9s是一款功能强大的Kubernete…...

Django-Rosetta与第三方翻译API集成:DeepL、Azure和Google翻译全攻略

Django-Rosetta与第三方翻译API集成&#xff1a;DeepL、Azure和Google翻译全攻略 【免费下载链接】django-rosetta Rosetta is a Django application that eases the translation process of your Django projects 项目地址: https://gitcode.com/gh_mirrors/dj/django-roset…...

2026 最新解读:AI 在数字资产管理中的 5 大应用场景与实践路径

核心要点 问题&#xff1a; 为什么越来越多企业在 2026 年开始用 AI 管理数字资产&#xff1f; 答案&#xff1a; 当图片、视频和内容素材的规模超过人工可控范围时&#xff0c;管理问题会直接转化为业务问题。AI 能在内容理解、搜索、复用、协作和安全等关键环节提供系统性能…...

MacBook Pro Ubuntu系统WiFi与Touch Bar问题完全解决方案

MacBook Pro Ubuntu系统WiFi与Touch Bar问题完全解决方案 【免费下载链接】T2-Ubuntu 项目地址: https://gitcode.com/gh_mirrors/t2u/T2-Ubuntu 如何精准识别硬件兼容性问题&#xff1f; 在MacBook Pro上安装Ubuntu后&#xff0c;用户常遇到两类硬件功能异常&#xf…...

Triton 九齿系列(三)《九齿二重:渐悟》

目录 九齿环境配置与基础概念 1. NineToothed Puzzles 2. 九齿张量基础 九齿核心三要素深入解析 1. 要素一&#xff1a;排布 2. 要素二&#xff1a;应用 3. 要素三&#xff1a;张量 总结 本文主要演示九齿如何简化并行编程。 九齿环境配置与基础概念 1. NineToothed …...

一文读懂HashMap底层结构与冲突解决:为什么它能实现高效查找?

在之前的博客中&#xff0c;我们聊了Cookie和Session如何解决HTTP无状态的问题&#xff0c;让服务器能“记住”客户端&#xff1b;也聊过HTTPS如何保护数据传输安全。而今天我们要聊的&#xff0c;是Java开发中最常用、最核心的数据结构之一——HashMap。无论是日常开发中的“键…...

自定义同花顺K线周期快捷键:从入门到精通

1. 为什么要自定义同花顺K线周期快捷键&#xff1f; 作为一个用了同花顺5年的老股民&#xff0c;我深知快捷键的重要性。记得刚开始炒股那会儿&#xff0c;每次切换K线周期都要用鼠标点来点去&#xff0c;手忙脚乱不说&#xff0c;还经常错过最佳买卖点。后来发现同花顺默认的K…...