用得最多的冒泡排序是不是少了个关键点?

前言

冒泡排序应该是很多小伙伴的最爱,简单、直接、好理解;回顾以往参与和阅读的项目,凡是牵涉自定义排序的算法,很大一部分都在用冒泡,其中很多都忽略了一个关键点;来,咱们细细品…

正文

1. 冒泡排序算法思想

冒泡排序(Bubble Sort)是属于交换排序的一种,顾名思义,就是一个元素,依次和相邻元素进行比较(升序或降序),然后进行交换,这个过程就称为冒泡。

算法思想

  • 从前往后(或从后往前)依次比较待排序数据中相邻的两个元素的值,若符合交换条件,则进行交换,直到待排序数据比较完,这样的过程就称为“一趟”冒泡排序;最终完成排序,最多需要n-1趟排序;(n代表元素个数)。

  • 每一趟排序都让一个元素移动到最终的位置,在之后的冒泡排序中就无需再对比了

  • 如果在一趟排序过程中未发生“交换”,则算法可提前结束; 这是个关键,很多小伙伴会忽略。

2. 冒泡排序算法实现与解析

代码实现(升序):

实现

运行效果如下:

结果

步骤解析(升序):

步骤

上图步骤说明:

上图中分三趟排序,每一趟的交换过程根据箭头方向进行,其中每一行中的绿色方框代表的是当趟排序需要交互的数据。

第一趟中,对原始数据array开始遍历,这里使用的是从往后的方式;

  • 第一趟第一步,对比后面两个元素9和3, 9大于3,所以9和3交换位置;

  • 第一趟第二步,对比相邻两个元素1和3, 1小于3,不需要交换;

  • 第一趟第三步,对比相邻两个元素6和1, 6大于1,所以6和1交换位置;

  • 第一趟第四步,对比相邻两个元素5和1, 5大于1,所以5和1交换位置;

  • 第一趟第五步,对比相邻两个元素2和1, 2大于1,所以2和1交换位置;遍历完成,第一趟排序结束,得到结果1、2、5、6、3、9;这里确定了元素1的最终位置,后续不在需要对比了;代码实现是这样的,但为了好理解,画图的时候都体现了一下。

第二趟排序,接着第一趟的排序结果进行冒泡排序

  • 第二趟第一步,对比后面两个元素3和9, 3小于9,不需要交换;

  • 第二趟第二步,对比相邻两个元素6和3, 6大于3,所以6和3交换位置;

  • 第二趟第三步,对比相邻两个元素5和3,5大于3,所以5和3交换位置;

  • 第二趟第四步,对比相邻两个元素2和3, 2小于3,不需要交换;

  • 第二趟第五步,对比相邻两个元素1和2, 1小于2,不需要交换;遍历完成,第二趟排序结束,得到结果1、2、3、5、6、9;其实这步没有,因为第一步已经确定了元素1的位置,可以不进行比对;这里只是便于理解虚拟出这一步。

第三趟排序,接着第二趟排序结果进行冒泡排序

  • 依次比较第二次结果的数据,最后发现没有数据进行交互,则排序结束,数据已经排好序;不需要再遍历,到此,整个冒泡排序完成;

3. 冒泡排序算法性能分析

时间复杂度

时间复杂度最坏情况就是待排序数据和要的结果完全逆序,则需要的比较的次数为:(n-1)+(n-2)+(n-3)+…+1,则最坏的时间复杂度为O(n2)。最好的时间复杂度就是待排序数据和要的结果完全一致,则比较n-1次即可,则最好的时间复杂度为O(n);所以最后的平均时间复杂度为O(n2)。

空间复杂度
在算法核心部分只采用了固定的几个中间变量(i,j,lengh,bChange),所以算法过程中消耗的内存是一个常量,则空间复杂度为O(1)

稳定性
由于在排序过程中是通过大于符号或小于符号进行比较,当等于时是不进行位置交换的,所以此算法是稳定的

综上所述,冒泡排序的时间复杂度为O(n2),空间复杂度为O(1),是不稳定算法;

总结

冒泡排序关键点一定要注意哦:

  • 每趟排序会确定一个元素的最终位置,这个元素在下一趟排序中可以不进行比较了;

  • 如果在一趟排序中没有发生数据交换,则代表数据列表已经有序,可以终止排序啦;

从上面可以看出,冒泡排序虽然简单,但需要依次遍历元素进行比较,当数据元素过多时,比较次数就越多;那有没有减少比较次数的解决方案呢;答案当然是肯定的,下期一起来聊聊快速排序

感谢小伙伴的:点赞收藏评论,下期继续~~~

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

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

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

相关文章

荐书 | 攻克世纪难题,拒绝领取菲尔兹奖的孤独数学天才的一生

今天小木给大家介绍五本数学科普文,了解了一些数学家研究数学、证明猜想的经历,他们的专研精神简直让小木五体投地!这也验证了一句经典名言“念念不忘,必有回响”。希望我们都能把时间奉献给自己喜欢的事情上。下面,让…

C# 搭建自己的NuGet服务器,上传自定义NuGet包

第一步搭建NuGet服务器创建空Web项目安装Nuget服务,目前最新版本2.8.2安装完成,会自动生产服务,出现如下界面发布该网站,并部署至IIS将.nupkg文件发布至网站的Packages目录。在VS中修改NuGet引用路径注意把自定NuGet放在首位&…

在不同的ObjectContext中更新数据

第一个using中获取一些数据 User u; using (var db new Entities()) {u db.Users.First(); } 在using外改变 u.NickName "ABC"; 在第二个using中把改变更新到库 using (var db new Entities()) { …… db.SaveChanges(); } 在网上看了一些使用ApplyPropertyC…

5分钟理解一致性哈希算法

来自:cywosp链接:https://blog.csdn.net/cywosp/article/details/23397179一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷…

linux 取消证书登录密码,SUSELinux 中为 SSH 访问设置不输入密码的证书认证登录方式...

SSH Client :linux-gxntSSH Server :xxzx-rdb目的: linux-gxnt 上的 nagios 用户以相同的用户(nagios)SSH 登录xxzx-rdb ,不用输入密码。1.在 SSH Client 和 Server 上使用 yast 创建 nagios 用户和nagios 组,nagios 用…

Blazor 初探

Blazor 初探目录一、新建项目二、ASP.NET Core Blazor 项目结构三、结合代码讲解四、改造五、配置文件的使用六、发布到 Linux(CentOS)题外话,期间遇到个问题反向代理七、地址独立观察员 2021 年 4 月 11 日上个月发了篇文章《Blazor 中如何下…

Relaltek声卡在UBUNTU下没有声音的解决方法。

为什么80%的码农都做不了架构师?>>> The computer has an HDA Intel chip (Realtek ALC887) and I couldnt open alsamixer (this error was displayed: "load hw:0 error: Invalid argument"), although the sound seemed to be working in …

.Net项目模板进阶

友情提示:这篇有点长,有点绕,加油!上一篇文章,简单的说明了一下.net项目模板的创建,主要是通过在项目文件*.csproj同目录下添加.template.config文件夹和里面的template.json,再用dotnet new -i…

Web Worker 使用教程

一、概述JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带来…

NET问答: C# 中是否有最高效的方式对大文件做 checksum ?

咨询区 Dario:我需要在多台机器间同步大文件,不过文件高达 6G,通常我都是每几周手工同步一次,考虑到文件的文件名经常变,为了检验一致性,我考虑使用 checksum 机制。我的计划是在 源机器 和 目标机器 上做 …

linux宝塔类似工具,有没有比宝塔面板更好的linux运维工具?

我是一个站长,现在建站seo是比较重要的部分,买了独立ip的云服务器主机,为了就是能够seo效果好点.建站优化我不担心,最郁闷的就是linux服务器运维这块,宝塔linux面板是必须安装到服务器上,比较消耗服务器内存,运维比较麻烦.还有就是购买宝塔面板的附带插件比较贵,基本买个网站防…

世界上最难的5种编程语言

每个程序员都熟悉许多编程语言。许多编程语言都是高级的,它们的语法是人类可读的。然而,也有一些低级语言,对于一个人来说,读起来很困难,但是可以理解。您是否遇到过一种既不可读又不可理解的编程语言?有一些编程语言…

云原生 | .NET 5 with Dapr 初体验

【Dapr】| 总结/Edison Zhou分布式应用运行时Dapr目前已经发布了1.1.0版本,阿里云也在积极地为Dapr贡献代码和落地实践。作为一名开发者,自然也想玩一玩,看看Dapr带来的新“视”界到底是怎么样的。1关于DaprDapr(Distributed Appl…

Python资料分享来袭,收下不谢!

近几年,机器学习一直很火,小编也有意识地收集了机器学习相关的资源,经过长时间的积累和沉淀,内容涵盖“Python教程”、“编程指南”、“学习视频”等。现在,小编准备将这些资料免费分享给大家!扫描下面二维…

我敢说,这是最全的常用设计模式汇总

先分享一个小故事两个年轻人是大学同班同学,他们毕业后一起被同一家公司录取,可以说是站在相同的起跑线上。两个人都对未来信心满满,踌躇满志。其中一人怀抱满腔激情,到处学热门框架,但受限于公司体量和业务逻辑&#…

Python为什么是编程语言中最skr的?

源 / 大数据文摘(BigDataDigest) 编译 / 小七、Virgil、AlieenPython的出现让计算机编程语言不再是生僻的专业技能,而是常人都能学习和使用的万金油。《经济学人(Economist)》近日对Python的一篇专题报道&#xff0c…

Linux系统管理员的Bash指南,11条Bash实践经验!

每个职业都有最常用的工具。对于许多系统管理员来说,shell可能是比较熟悉的。在大多数Linux和其他类Unix系统上,默认的shell是Bash。Bash是一个相当古老的程序,它起源于20世纪80年代后期。但它建立在更多,更老的shell上&#xff0…

Asp Net Core 5 REST API 使用 RefreshToken 刷新 JWT - Step by Step(三)

翻译自 Mohamad Lawand 2021年1月25日的文章 《Refresh JWT with Refresh Tokens in Asp Net Core 5 Rest API Step by Step》 [1]在本文中,我将向您演示如何在 Asp.Net Core REST API 中将 Refresh Token 添加到 JWT 身份验证。我们将覆盖的一些主题包含&#xff1…

国外的程序猿可以工作到退休而国内的为什么这么短命(思维认知)

首先我想说明的是国外的程序猿也存在加班,他们也要赶项目,所以加班不算什么原因。真正的原因是我们国内的很大一部分程序猿只是工具的使用者,不会去思考工具的产生和原理,用惯了一个高效的工具就被这个工具套牢成为奴隶&#xff0…

使用 docker 部署 mdnice

使用 docker 部署 mdniceIntro最近 mdnice 的在线版使用开始需要登录才能访问,一方面我觉得我的文章会被保存的他们的服务器上,使用他们的平台就能轻松拿到很多文章的数据,他们甚至是可以直接拿到 markdown 原始内容去别的平台分享转发&#…