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

c---冒泡排序模拟qsort

一、冒泡排序

二、冒泡排序优化排各种类型数据

文章目录

  • 一、冒泡排序
    • 二、冒泡排序优化排各种类型数据


冒泡排序

冒泡排序原理:两两相邻元素进行比较
在这里插入图片描述
在这里插入图片描述

初级版

void bulle_sort(int* a, int sz)
{int i = 0;for (int i = 0; i < sz-1; i++){int j = 0; for (j = 0; j < sz - 1 - i; j++){if (a[j] > a[j+1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;}}}
}

这是冒泡排序初级版,不管其原内容是否有序都会进行比较,如果原内容原本就是有序的,再每个都进行比较效率就会低下,那么这时候可以改进一下,想一个标记变量来记录是否有序,如int
falg = 0; 如果无序的情况下falg会变为1,有序的情况下falg保持0不变,如果一趟下来falg 为0
不变,那么就是有序的就不用再比较后面趟数了,这样使其在有序的情况下时间复杂度为O(n),大大提高了效率

改进版

void bulle_sort(int* a, int sz)
{int i = 0;int falg = 0;for (int i = 0; i < sz-1; i++){int j = 0; for (j = 0; j < sz - 1 - i; j++){if (a[j] > a[j+1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;falg = 1;}}if (falg == 0){break;}}
}

冒泡排序优化排各种类型数据
上面冒泡排序可以发现只能够排序整形
在这里插入图片描述
那要是我们想利用冒泡来排其他不同类型应该如何实现呢?这里就引入c语言里的一个库函数qsort(),在cplusplus上搜索qosrt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以发现这是一个排序函数,且qsort函数有四个参数,void * base目标数组,待排序的起始地址,size_t num待排序数组大小,size_t表示无符号类型,由于数组大小不可能为负数,因此设置为size_t更为合适,size_t size,数组中每个元素是多少字节,其实就是每个元素是什么类型
在这里插入图片描述

int (*compar)(const void*,const void*)

这是一个函数指针,是比较函数的函数指针,而comper实现的是比较功能,
在这里插入图片描述
比较函数在这里插入图片描述

由于比较类型不知道是什么类型的,因此用void*,这里这个设计十分合理,void*,void*存的是要比较两个元素的地址,是因为设计者在设计时不知道我们要比较什么类型的,因为void*指针可以接收任意类型变量的地址。comper函数返回类型为in类型,第一个比第二个于返回1,相等返回0,小于返回-1


qsort函数运用

int comper(const void* s1, const void* s2)
{return *((int*)s1) - *((int*)s2);//由于我们自己使用时知道了是什么类型,因此强转为该类型就可,//然后再对其解引用就可以相互进行比较了
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);//bulle_sort(arr, sz);qsort(arr, sz, sizeof(arr[0]), comper);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

可以发现出了警告是qsort未定义,这是因为没有包含它所需的头文件

在这里插入图片描述

可以往下翻找到它该用什么头文件
以qsort排序结构体

#include<string.h>
typedef struct Stu
{char name[20];int age;
}Stu;
int comper_stu_by_name(const void* s1, const void* s2)
{//按照名字比较,两个字符串比较是不能直接相减,用库函数strcmp进行比较//强制类型转换为结构体指针,然后再->找到结构体成员变量namereturn strcmp(((Stu*)s1)->name , ((Stu*)s2)->name);//由于我们自己使用时知道了是什么类型,因此强转为该类型就可,//得到其地址再对其解引用就可以相互进行比较了
}int main()
{Stu s[3] = { {"zhangsan",20},{"wangwu",30},{"lisi",50} };qsort(s, sizeof(s)/sizeof(s[0]), sizeof(s[0]), comper_stu_by_name);for (int i = 0; i < sizeof(s)/sizeof(s[0]); i++){printf("%s %d\n", s[i].name, s[i].age);}
}

在这里插入图片描述
strcmp比较字符串函数
在这里插入图片描述
在这里插入图片描述

strcmp返回类型为int
qsort可以实现任意类型的数据的排序;

以冒泡模拟qsort

//比较时需要比较什么类型自己可以定义,然后强转
//需要排不同类型只需要在这里更改就可以了
int comper(void* s1, void* s2)
{return *((int*)s1) - *((int*)s2);
}void swap(char* buf1, char* buf2, int width)
{int i = 0;//width是数组中每个元素的字节大小,其实以我们来看,知道width就可以知道是什么类型,for (i = 0; i < width; i++){//将每个字节都交换char tmp = *buf1;*buf1 = *buf2;*buf2 = tmp;buf1++;buf2++;}
}//与qsort函数内部一致
//比较类型不明确,所有void*
void bulle_qsort( void* a, size_t sz, size_t width, int (*comper)(const void* s1, const void* s2))
{size_t i = 0;int falg = 0;for (int i = 0; i < sz-1; i++){size_t j = 0; for (j = 0; j < sz - 1 - i; j++){if (comper((char*)a+j*width,(char*)a+(j+1)*width)>0)//实现比较,交换,且由于不知道要比较什么类型,,那么我们只有使用偏移量比较{swap((char*)a + j * width, (char*)a + (j + 1) * width, width);//由于不知道类型,那么就交换每个字节,把每个元素大小传过去falg = 1;}}if (falg == 0){break;}}
}int main()
{int a[] = { 9,8,7,6,5,4,3,2,1 };int sz = sizeof(a) / sizeof(a[0]);//这里可以排任意类型的数据,我这里以整形数组模拟bulle_qsort(a, sizeof(a) / sizeof(a[0]), sizeof(a[0]), comper);for (int i = 0; i < sz; i++){printf("%d ", a[i]);}return 0;
}

在这里插入图片描述
冒泡模拟实现qsort就到这里了,有兴趣的小伙伴可以区试试其他类型的排序吧

相关文章:

c---冒泡排序模拟qsort

一、冒泡排序 二、冒泡排序优化排各种类型数据 文章目录一、冒泡排序二、冒泡排序优化排各种类型数据冒泡排序 冒泡排序原理&#xff1a;两两相邻元素进行比较 初级版 void bulle_sort(int* a, int sz) {int i 0;for (int i 0; i < sz-1; i){int j 0; for (j 0; j…...

Java知识复习(十四)JS

1、数据类型 基本数据类型&#xff1a;null、undefinde、boolean、string、number、symbol&#xff08;ES6新增&#xff09;引用数据类型&#xff1a;Function、Array、Object、Map和Set&#xff08;ES6新增&#xff09; 2、let、var和const的区别 var定义的变量&#xff0c…...

代码随想录刷题-数组-移除元素

文章目录写在前面习题我的想法暴力解法双指针写在前面 本节对应代码随想录中&#xff1a;代码随想录 习题 题目链接&#xff1a; 27. 移除元素- 力扣&#xff08;LeetCode&#xff09; 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&a…...

聚观早报 |拼多多跨境电商业务正式登陆澳洲;中国加快6G网络研发

今日要闻&#xff1a;拼多多跨境电商业务正式登陆澳洲&#xff1b;全球自动驾驶公司排名特斯拉垫底&#xff1b;中国将加快 6G 网络研发&#xff1b;B站再次“崩”上热搜&#xff01;已闪电修复&#xff1b;微软将必应AI聊天每次对话上限增加至8条拼多多跨境电商业务正式登陆澳…...

MDK Keil5 创建Stm32工程-理论篇(这里以Stm32F103Zet6为例)

一、文件夹创建与文件说明整个工程可以粗略的划分为几个文件夹&#xff1a;BSP底层驱动比如GPIO\Timer等驱动文件CMSIS内核相关的文件Firmware生成的固件下载文件Mycode用户编写的相关文件&#xff0c;主要编写的文件都在这个文件夹里Project工程文件startup芯片启动文件STM32F…...

应届大学生学什么技术好?哪些技术适合年轻人?

到了毕业季&#xff0c;应届大学生面临的就是就业问题&#xff0c;很多专业的大学生难以找到对口的工作&#xff0c;或是不得已随便就业&#xff0c;或者是学个技术高薪就业&#xff0c;那么&#xff0c;问题来了&#xff0c;应届大学生学什么技术好&#xff1f;哪些技术适合年…...

车企数据分类分级的实践指南出炉!“数据安全推进计划”发布,奇点云参编

日前&#xff0c;“数据安全推进计划”&#xff08;DSI&#xff09;正式发布《智能网联汽车数据分类分级实践指南》&#xff08;下文简称“指南”&#xff09;&#xff0c;旨在以合规为主要导向&#xff0c;明确智能网联汽车数据分类分级的方法论&#xff0c;为数据全生命周期的…...

Nginx学习 (2) —— 虚拟主机配置

文章目录虚拟主机原理域名解析与泛域名解析&#xff08;实践&#xff09;配置文件中ServerName的匹配规则技术架构多用户二级域名短网址虚拟主机原理 为什么需要虚拟主机&#xff1a; 当一台主机充当服务器给用户提供资源的时候&#xff0c;并不是一直都有很大的用户量&#…...

Java 动态代理简述和实例

Java动态代理是一种在运行时动态创建代理对象的技术。它可以让我们在不修改原始代码的情况下&#xff0c;对原始对象进行增强或者添加额外的行为。这种代理方式可以用于很多场景&#xff0c;例如AOP编程、RPC框架等。动态代理是基于Java反射机制实现的&#xff0c;它允许程序在…...

Unity编译器扩展(Advanced Editor Scripting)

Untiy编译器扩展允许我们对编译器的增加自己编写的的功能菜单栏MenuItemContextMenu和ContextMenuItemContextMenuContextMenuItemMenuItem 该属性允许您将菜单项添加到主菜单和检查器窗口上下文菜单。 该属性将任何静态函数转换为菜单命令。只有静态函数可以使用该属性。 Men…...

AFR机制及流程介绍

AFR(Auto Fast Return)不符合3GPP协议标准,因此终端默认是disable状态。如果运营商有要求可以配置开启。 AFR有两种场景 2G或者3G AFR到4G4G AFR到5G3G AFR TO 4G AFR到LTE功能的作用就是终端从LTE Handover或者重定向到3G进行业务,等业务做完后能够快速回到LTE网络。...

9.Hbase 部署

9.Hbase部署 注意事项&#xff1a; 1&#xff1a;必须事先安装 Hadoop分布式集群&#xff0c;zookeeper分布式集群 2&#xff1a;查看版本号&#xff1a; hbase version1、解压文件并改名 tar -zxvf /opt/software/hbase-2.2.3-bin.tar.gz -C /usr/app/ mv hbase-2.2.3/ hba…...

【maven 学习记录】

maven 学习记录一、maven基础1. maven是什么2. maven的作用3. maven的下载安装4. maven仓库5. maven坐标6. 第一个maven项目 手工实现7. maven插件8. 依赖管理9. 生命周期二、maven进阶一、maven基础 1. maven是什么 maven的本质是一个项目管理工具&#xff0c;将项目开发和管…...

NB-IOT宣传这么多年,这次总算用好了吧

一、方案概述随着实体经济快速发展&#xff0c;石化、港口、货场、工地等区域规模日益扩大&#xff0c;厂区面积广阔、环境复杂、作业人员和车辆众多&#xff0c;如无法实时掌握工作人员状态及外来人员位置、外来车辆情况等问题&#xff0c;将存在非常大的安全隐患。今天小编介…...

sort函数对结构体|pair对组|vector容器|map排序|二维数组的第x列 的排序

目录 sort对 vector容器 sort对 vector<pair<int,int>>对组 sort对 结构体 结构体外部规定排序 结构体内部运算符重载 map容器的排序 map的键排序 map的值排序 sort对二维数组的排序 sort对 vector容器 sort()函数可以用于对vector容器进行排序。具体来…...

Java定时器Timer的使用

一、Timer常用方法 Timer应用场景&#xff1a; 1、每隔一段时间执行指定的代码逻辑&#xff08;即按周期执行任务&#xff09; 2、指定时间执行指定的代码逻辑 为方便测试并查看运行效果&#xff0c;首先先建一个类并继承TimerTask&#xff0c;代码如下: package timerTest…...

MySQL安装和配置

下载官网下载mysql解压版本&#xff1a;配置环境变量下载完成后直接解压到需要放的文件夹&#xff0c;根据文件夹来配置环境变量&#xff1b;新建系统变量&#xff0c;变量名自取&#xff0c;值是MySQL的目录编辑path环境变量&#xff0c;加上MySQL的bin目录 %MYSQL_HOME%\bin配…...

openpnnp - 载入板子后,要确定板子的放置角度

文章目录openpnnp - 载入板子后,要确定板子的放置角度概述用openpnp提供的功能来确定被夹住的板子的左下角原点位置和板子的角度备注ENDopenpnnp - 载入板子后,要确定板子的放置角度 概述 设备是有夹具的, 用百分表打过, 夹具本身在Z方向的平行度是没问题的. 但是, PCB板子的…...

HCIP知识点(前三天)

复习HCIA&#xff1a; 一、TCP/IP模型&#xff0c;OSI模型 OSI 开放式系统互联参考模型 应用层 抽象语言—>编码 表示层 编码—>二进制 会话层 应用程序内部的区分地址&#xff08;无标准格式&#xff09; 传输层 TCP/UDP – 分段&#xff08;受MTU限制&#xff09;、端…...

模板学堂丨妙用Tab组件制作多屏仪表板并实现自动轮播

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https://dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&#xff0c;并…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...