[数据结构 -- 手撕排序第三篇] 冒泡排序

news2024/11/14 21:44:05

目录

1、常见的排序算法

1.1 交换排序基本思想

2、冒泡排序的实现

2.1 基本思想

2.2 单趟排序

2.2.1 单趟排序分析

2.2.2 单趟排序实现代码

3、冒泡排序完整代码实现

3.1 思路分析

3.2 代码实现

4、时间复杂度

5、优化算法

5.1 优化算法思路

5.2 优化算法代码实现

6、冒泡排序的特性总结


1、常见的排序算法

1.1 交换排序基本思想

冒泡排序属于交换排序之一,我们先来了解以下冒泡排序思想。

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

2、冒泡排序的实现

2.1 基本思想

我们本篇冒泡排序以排升序来举例

基本思想:对比数组前一个数字与后一个数组的大小,当前一个数大于后一个数,我们就交换两个数字,遍历整个数组,不断判断,进行交换。

2.2 单趟排序

2.2.1 单趟排序分析

单趟排序时,第一趟排序就将最大数排到了数组尾。

2.2.2 单趟排序实现代码

for (int j = 1; j < n; j++)
{
    if (a[j - 1] > a[j])
    {
        int tmp = a[j - 1];
        a[j - 1] = a[j];
        a[j] = tmp;
    }
}

3、冒泡排序完整代码实现

3.1 思路分析

我们看到单趟排序第一趟时,就将最大值排到了数组尾部,按照这样的分析,我们排n-1趟就可以实现将整个数组完全排序。

这里为什么是 n-1 趟,当倒数第二小的数字排好序后,倒数第一小的数字自然就排好。

3.2 代码实现

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

4、时间复杂度

冒泡排序时间复杂度:O(N^2)。

无论是数组有序或者无序都是O(N^2),因为无论是否有序我们都需要比大小,而比大小正好是在内层循环里面,所以时间复杂度是与数组是否有序无关。

5、优化算法

5.1 优化算法思路

其实我们不难想到,如果数组是有序的,那么就不用循环那么多次了。

Q:那我们如何才能判断出数组是有序的呢?

A:其实不难,当我们数组是有序的时候就不发生交换,这就是优化算法的关键。

那么我们如何写呢?我们在内层循环外定义一个 flag = 1,假设是有序,在交换语句里我们将 flag 改为 0,当内层循环完后我们判断flag是否为1,为1就说明数组是有序的,此时就break,跳出了整个循环。

5.2 优化算法代码实现

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

优化后最优的时间复杂度:O(N)此时只是第一趟循环,判断是否有序。

6、冒泡排序的特性总结

1. 冒泡排序是一种非常容易理解的排序
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:稳定

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux网络】网络基础(一)

Linux网络基础 1 网络背景1.1 网络发展1.2 局域网和广域网 2 认识“协议”2.1 网络协议分层&#xff08;高内聚&#xff0c;低耦合思想&#xff09;2.1.1 高内聚&#xff0c;低耦合简单理解2.1.2 协议分层的简单例子 3 OSI七层模型3.1 TCP/IP五层&#xff08;或四层&#xff09…

前端LayUI框架快速上手实现登入注册

目录 一、Layui简介 1. 什么是LayUI 2. LayUI的特点 二、LayUI入门 1. LayUI下载 2. LayUI入门使用 1. 在web项目中导入LayUI文件中的layui文件 2. 在JSP页面引入css、js文件 3. 制作一个简单的猜字游戏 4.效果展示 三、Layui实现简单登入功能 环境搭建 一、Layui简…

spring boot+MySQL实现班级综合测评管理系统

随着电子技术的普及和快速发展&#xff0c;线上管理系统被广泛的使用&#xff0c;有很多事业单位和商业机构都在实现电子信息化管理&#xff0c;班级综合测评管理也不例外&#xff0c;由比较传统的人工管理转向了电子化、信息化、系统化的管理。 传统的班级综合测评管理系统&am…

运维工具的学习(1)--Curl

1.1 curl简介 ​Curl是一个非常实用的、用来与服务器之间传输数据的工具&#xff1b;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP)&#xff0c;curl设计为无用…

Kafka入门,offset的默认维护位置(二十一)

offset的默认维护位置 0.9版本之前&#xff1a;consumer默认将offset保持在zookeeper中 从0.9版本开始&#xff0c;consumer默认将offset保存在kafka一个内置的topic中&#xff0c;该topic为__consumer_offsets __consumer_offsets 主题里面采用key和value方式存储数据&#x…

【谷粒学院】NUXT框架

一、服务端渲染技术NUXT 1、什么是服务端渲染 服务端渲染又称SSR (Server Side Render)是在服务端完成页面的内容&#xff0c;而不是在客户端通过AJAX获取数据。 服务器端渲染(SSR)的优势主要在于&#xff1a;更好的 SEO&#xff0c;由于搜索引擎爬虫抓取工具可以直接查看完全…

【分布式应用】ELK 企业级日志分析系统

目录 一、ELK概述1.1、ELK 简介1.2 为什么要使用 ELK1.3完整日志系统基本特征1.4 ELK 的工作原理 二、ELK Elasticsearch 集群部署2.1环境准备2.2&#xff0e;部署 Elasticsearch 软件2.3安装 Elasticsearch-head 插件&#xff08;1&#xff09;编译安装 node&#xff08;2&…

任务六:LTE-Advanced 关键技术

LTE-Advanced 关键技术 一、载波聚合&#xff08;Carrier aggregation&#xff0c;CA&#xff09;二、多天线增强&#xff08;Enhanced Multiple Antenna Transmission&#xff09;1、上行多天线增强2、下行多天线增强。 三、协作多点传输&#xff08;Coordinated Multiple Poi…

buu刷题Reverse总结

[FlareOn1]Bob Doge 是一个C#编写的程序&#xff0c;在dnspy中打开&#xff0c;找到主函数&#xff0c;可以看到大致逻辑 不知道dat_secret的值&#xff0c;动态调试看看 DnSpy动态调试&#xff1a; 在主函数中添加断点&#xff0c;调试&#xff0c;因为本题的fag形式为&…

spring 自带的校验框架使用

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>编写规则 开启校验

springboot+mysql财务管理系统

财务管理系统的开发运用java技术、springboot框架&#xff0c;MIS的总体思想&#xff0c;以及Mysql等技术的支持下共同完成了该系统的开发&#xff0c;实现了财务管理的信息化&#xff0c;使员工体验到更优秀的财务管理&#xff0c;管理员管理操作将更加方便&#xff0c;实现目…

消息队列篇面试题

一、MQ基础 1.1、为什么使用MQ&#xff1f;MQ的优点 简答 异步处理 - 相比于传统的串行、并行方式&#xff0c;提高了系统吞吐量。 应用解耦 - 系统间通过消息通信&#xff0c;不用关心其他系统的处理。 流量削锋 - 可以通过消息队列长度控制请求量&#xff1b;可以缓解短时间…

(vue)vue项目实现语音播报

(vue)vue项目实现语音播报 解决参考1&#xff1a; 在 Vue 项目中&#xff0c;你可以使用 Web Speech API 中的 SpeechSynthesis 接口来实现文本内容的自动朗读。下面是一个示例&#xff1a; 1.在 Vue 组件的模板中添加一个按钮&#xff0c;用于触发朗读&#xff1a; <templa…

Appium+python自动化(二)- 环境搭建—下(超详解)

简介 上一篇android测试开发环境已经准备好&#xff0c; 那么接下来就是appium的环境安装和搭建了。 环境装好后&#xff0c;可以用真机连电脑&#xff0c;也可以用android-sdk里面的模拟器&#xff08;当然这个模拟器不是很好用&#xff09;&#xff0c;我一般喜欢真机&#…

【QT】——布局

目录 1.在UI窗口中布局 2.API设置布局 2.1 QLayout 2.2 QHBoxLayout 2.3 QVBoxLayout 2.4 QGirdLayout 注意 示例 Qt 窗口布局是指将多个子窗口按照某种排列方式将其全部展示到对应的父窗口中的一种处理方式。在 Qt 中常用的布局样式有三种&#xff0c;分别是&#xff1…

CRM 软件如何帮助企业改善营销活动?

一场富有成效的营销活动&#xff0c;是在正确的时间将正确的信息传递到正确的受众面前。为此&#xff0c;你必须充分了解对潜在客户和现有客户的需求&#xff0c;然后创建满足这些需求的营销活动。 CRM 软件和工具可以帮助营销团队收集和分析受众数据&#xff0c;以建立更有效的…

如何在Windows的优化驱动器工具中优化驱动器

​优化硬盘是提高电脑性能的最佳方法之一。Windows 包括一些功能,可以帮助优化电脑目前使用的不同类型的驱动器。无论你的电脑使用哪种类型的驱动器,Windows 都会自动选择适合你的驱动器的优化。 默认情况下,优化驱动器(以前称为磁盘碎片整理程序)会在自动维护中设置的时…

6.2.3 网络基本服务---文件传输协议(FTP)

6.2.3 网络基本服务—文件传输协议&#xff08;FTP&#xff09; FTP&#xff08;File Transfer Protocol&#xff09;是Internet上使用最为广泛的文件传送协议&#xff0c;FTP提供交互式的访问&#xff0c;允许客户上传文件到服务器或者从服务器下载文件&#xff0c;FTP屏蔽了…

Hive(19):DML之Insert插入数据

1 背景:RDBMS中insert使用(insert+values) 在MySQL这样的RDBMS中,通常是insert+values的方式来向表插入数据,并且速度很快。这也是RDBMS中插入数据的核心方式。 INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 假如说对Hiv…

朝花夕拾 - 编程马拉松!Coding 40h,着手 AI 展望未来

眼看时间已过半&#xff0c;回忆唏嘘难忘怀。 Hello 大家好&#xff0c;我是爱折腾的前端工程师 jsliang~ 2023 过得很快&#xff0c;眼瞅着加加班已去大半年&#xff0c;一边恨自己没赶上今年大热门&#xff0c;一边蒙头睡觉恢复体力并感叹精神不如初。 在我以为潮流箭步离我而…