【八大经典排序算法】冒泡排序

【十分钟学个算法】· 冒泡排序算法 一、冒泡排序的诞生 / 第一个应用场景 1960年,英国计算机科学家霍尔在参加英国国家物理实验室的俄文机械翻译项目时,为了提高翻译效率而提出冒泡排序(只存在此说法,无实证)。 当时俄文到英文的词汇列表是以字母顺序存储在一条长磁带中,翻译词汇时需遍历磁带,从而获取译文。当有一整段俄文句子需要翻译时,为了提高效率,往往将句子的词按照字母顺序先行排序,这样就能只遍历一遍磁带,就获得译文。 例如一个有5个词组成的俄文句子,如果不提前排序,需要遍历5遍磁带才能获得... 阅读详情

【八大经典排序算法】冒泡排序


在这里插入图片描述


一、概述

冒泡排序由于其简单和易于理解,使其成为初学者学习排序算法的首选,也是初学者接触到的第一个排序算法。其原理是通过重复交换相邻的元素来将最大的元素逐步“冒泡”到最后。冒泡排序由美国计算机科学家冯·诺伊曼(John von Neumann)于1945年提出。

冯·诺伊曼是计算机科学和现代计算机体系结构的奠基人之一,他在设计计算机算法时,意识到排序是计算机科学中的一个基本问题。于是,他提出了冒泡排序算法。

冒泡排序的思想是基于比较相邻元素的大小,如果顺序不正确,则交换它们的位置。通过多次遍历数组,每次都将最大的元素“冒泡”到末尾,最终实现整个数组的排序。

二、思路解读

我们知道冒泡排序的基本思想本思想是通过不断交换相邻元素的位置,将最大(或最小)的元素逐步“冒泡”到序列的末尾。(接下来以升序为例)
我们可以从序列的第一个元素开始,依次比较相邻的两个元素的大小。如果前一个元素大于后一个元素,则交换它们的位置,相当于将较大的元素冒泡到后面。然后继续对剩余的元素进行比较和交换,直到最后一个元素,此时最大的元素就成功冒泡到序列的末尾啦。
上述过程我们已经将整个排序中最大的数冒泡到了最尾端,接下啦要做的就是不断重复上述步骤,每次需比较和交换的范围缩小一个元素,直到整个序列有序为止。
 
动画演示:
在这里插入图片描述


三、代码实现

上述思路如何转换为代码呢?(以升序为例)
我们可以通过双重循环来实现。
第一层循环表示要排序的次数。假设我们有n个元素,此时我们只需要排序n-1次,让最后n-1个元素有序,此时剩余的最后一个元素一定是最小的。
第二层排序表示将每次排序中的最大数冒泡到最后。需要注意的是,我们每完成一次排序,待排序的元素个数就少1。

 
【代码】:

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void BubbleSort(int* a, int n)
{
	//排序n-1次
	for (int i = 0; i < n - 1; i++)
	{
		//将最大元素冒泡到最后
		//为什么边界条件是n-1-i呢?
		//因为n个数,两两比较,即比较n-1对。同时每排序完i次,待排序的个数就减i。
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (a[j] > a[j + 1])
			{
				Swap(&a[j], &a[j + 1]);
			}
		}
	}
}

四、优化

上述代码已经可以完整实现一个排序了。但有一个问题,如果我们带排序的数据接近有序呢?比如:
在这里插入图片描述
我们发现只需要简单交换1次即可。但按原来代码所示,一次过后虽然排序已经有序了,但还是要继续比较的。未免太死板了。
所以我们可以在每次排序前多加一个变量flag,每次排序过程中如果有数据交换,就改变flag的值。
最后,我们只需通过判断flag的值是否改变即可判断是否已经有序。如果flag的值没改变(以升序为例),则说明数据中后一项都比前一项大,此时数组有序。

【最终代码】:

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

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

时间复杂度:O(N^2)
空间复杂度:O(1)

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

八大经典排序算法(C语言) 目录 前言 一、冒泡排序 二、快速排序 三、选择排序 四、插入排序 五、归并排序 六、希尔排序 七、堆排序 八、基数排序(正整数) 参考资料   前言         初学编程,记录一下八大经典排序算法,以便后续复习。参考借鉴了很多文章和代码,在本文末尾会进行标注,也在此对各位前辈表示感谢。         本文记录的排序算法有:冒泡排序、快速排序、选择排序、插入排序、... 阅读详情

相关推荐

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

a_zxswer的博客 1687

日撸 Java 三百行(46 天: 快速排序:20世纪十大最伟大的算法之一)

注意:这里是JAVA自学与了解的同步笔记与记录,如有问题欢迎指正说明

ALBlack的博客 1266

ROS四旋翼无人机快速上手指南(4):阿木实验室PX4功能包飞行控制分析与讲解(重点章节)

成就更好的自己 这一章详细讲解一下阿木实验室(AMOV)的开源项目px4_command功能包,此功能包通过mavlink协议直接控制烧录px4固件的自驾仪,还融合了来自各个传感器的位姿,距离等信息,此外,功能包提供的接口向上对接应用层算法级的程序例如SLAM,kfc目标检测引导,路径规划等算法,因此,在整个无人机控制中起到了承上启下至关重要的作用。 用到的文件及工具包链接如下: AMOV实验室源码如下: https://gitee.com/theroadofengineers/px4_comman

The Road of Engineer 6168

快速排序算法的发明者霍尔

霍尔介绍 霍尔 (Sir Charles Antony Richard Hoare) 是一位英国计算机科学家,他也是著名的快速排序算法的发明者。他出生于斯里兰卡,1956年毕业于牛津大学。然后的两年里他服役于英国皇家海军,主要工作任务是研究俄国的现代军事,并因为这个原因开始学习俄语。在他结束服役后,他以研究生的身份进入莫斯科大学主攻计算机翻译。在莫斯科学习的一年中,因为偶然的机会他为参加展览的公司Elliott Brothers充当翻译。当他回国后,这家公司立即聘用了他,因为霍尔会俄语的缘故,公司还为..

多米学算法的博客 6243

一文详解本地知识库RAG(检索增强):LangChain + Hugging Face 三件套 + 本地大模型 + MCP 协议 + Chroma + Agent 全流程实战

模型上下文协议(MCP)是 Anthropic 推出的开放标准,基于 JSON-RPC 2.0,为 AI 应用与外部工具/数据源之间提供统一的双向通信协议,被称为“AI 应用的 USB-C”。LangChain 是一个围绕 LLM、提示模板(Prompts)、记忆(Memory)、链(Chains)、工具(Tools)和代理(Agents)等组件打造的开源框架,旨在简化复杂自然语言应用的开发。:任意可调用的功能或服务(API、数据库查询、本地函数等),由 Agent 或 Chain 在推理过程中调用。

weixin_41645791的博客 1424

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看?

本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。

weixin_29100399的博客 353

冒泡排序——摘自《百度百科》

冒泡排序——摘自《百度百科》 本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元...

wsxiaole的专栏 550

「UG/NX」BlockUI 控件集合目录大纲

Block UI Styler 模块设计对话框是官方推荐使用的对话框制作方法,它能够与NX自身风格相统一,在实际开发中经常使用。文字内容包含:NX所有控件介绍的链接、内部控件调用的基础介绍、官方案例查看路径、控件的特殊用法篇链接、番外篇链接。

何曾参静谧的博客 2670

冒泡排序名称的由来

冒泡排序名字的由来

Sky*殇的博客 792

15、降维算法:原理、实现与应用

本文深入介绍了多种降维算法,包括线性方法如主成分分析(PCA)和线性判别分析(LDA),以及非线性方法如Sammon映射、t分布随机邻域嵌入(t-SNE)和自编码器。文章通过C++库Dlib和Shogun展示了这些算法的具体实现,并结合图像压缩和数据可视化等实际案例,分析了不同算法的适用场景。此外,还探讨了降维算法的选择策略、优化改进方法以及未来发展趋势,为读者提供了全面的技术理解和应用指导。

lemon的博客 115

一套适合 ABAP 初级和中级开发人员,从入门到提高的 ABAP 学习教程

曾几何时,ABAP 就是 SAP 的代名词。ABAP 这门编程语言造就了 SAP 名噪一时的 R/3 产品,同时也是如今 SAP 旗舰级产品,SAP S/4HANA 底层的实现语言。 ABAP 不仅代表着 SAP 这家公司在企业级管理软件市场辉煌的过去,ABAP 自身也在不断地进化着。SAP 不仅在本地部署(On-Premise)领域继续保持着自己绝对的统治地位,而且在云应用领域(Software-as-a-Service, 简称 SaaS), 也推出了自己的解决方案,比如 SAP S/4HANA Clo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5906

八大排序之冒泡排序

#include &amp;lt;iostream&amp;gt; using namespace std; void BubbleSort(int* numbers, const int length); int main() { int numsArr[100] = { 0 }; int length = 0; cin &amp;gt;&amp;gt; length; for (int...

Alexander的博客 252

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

排序算法总结(Python版)

经典排序算法总结与实现 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序。希望能帮助到有需要的同学。

Dby_freedom的博客 2万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

十大经典排序算法总结整理

参考文章: 十大经典排序算法最强总结:https://www.cnblogs.com/guoyaohua/p/8600214.html 排序算法总结:https://www.runoob.com/w3cnote/sort-algorithm-summary.html 术语说明 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数...

ytusdc的博客 6948

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

八大排序--快速排序、希尔排序、冒泡排序、归并排序、堆排序等经典排序算法思想

建堆(大根or小根),堆是一个完全二叉树形式,每次在根节点处会得到最大(或最小)的元素,与最后一个叶节点交换,重新整理堆,以此类推。时复:o(n log n) 建堆时间:o(n) 空复:o(1) 不稳定 适用:顺序和链式。时复:o(n^2) 空复:最坏o(n^2),最好o(log n) 不稳定 适用:顺序。时复:o(n^2) 空复:o(1) 不稳定 适用:顺序和链式和关键字较少的情况。时复:O(d(n+r)) 空复:o(r) 稳定 适用:顺序和链式。时最坏:o(n^2) 空:o(1) 不稳定 适用:顺序。

m0_69724592的博客 803

八大排序算法总结与java实现

原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结,强行学习。首先罗列一下常见的十大排序算法: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 其中我们讨论的这八大排序算法的实现可以参考我的Github:SortAlgori

Mlib 1万+

【初阶数据结构与算法】——手撕八大经典排序算法

常见排序算法详解及分析,带你手撕希尔、堆排、快排、归并等经典排序算法

m0_70980326的博客 3838

八大经典排序算法详解

我记得上大学的时候,老师一直跟我们强调:“算法才是编程的灵魂”,找工作面试的时候,算法和数据结构也是绝对不可避免的,面试官可能一言不合就让你手写一个排序算法。我把最经典的八大排序算法原理...

tanqingbo的博客 850

【算法】八大经典排序算法详解

我记得上大学的时候,老师一直跟我们强调:“算法才是编程的灵魂”,找工作面试的时候,算法和数据结构也是绝对不可避免的,面试官可能一言不合就让你手写一个排序算法。我把最经典的八大排序算法原理...

fengdu78的博客 431

深度剖析八大经典排序算法—C++实现(通俗易懂版)

内容会持续更新,有错误的地方欢迎指正,谢谢! 引言 需握各种排序和常用的数据结构的核心思想,并知道是以什么样的方式解决了什么样的问题。 该博客的示例代码均以递增排序为目的~ 学习建议:切忌看示例代码去理解算法,而是理解算法原理写出代码,否则会很快就会忘记。 //排序原始数组: int a[10]= { 7,5,3,4,4,1,9,45,121,3 }; 算法分类 八大经典排序...

陈云佳的专栏 3018

八大排序算法原理及实现

原文链接:八大排序算法原理及实现 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。 快速排序:是目前基于比较的内部排序中被认为是最...

Yannick Jiang 的专栏 6250

八大排序算法

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分...

黄规速博客:学如逆水行舟,不进则退 105万+

Java算法-八大排序(图解+代码)

八大排序之冒泡排序 冒泡排序原理:相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 冒泡排序图解: 代码演示: package 八大排序; import java.util.Arrays; public class 冒泡排序 { public static void main(String[] args) { //冒泡排序的原理:相邻元素两两比较...

Despicable_Me的博客 3817

关于八大排序算法(C++)

选择类排序:每一轮可以定下来一个数的位置 简单选择排序 时间复杂度:O(n^2) 空间复杂度:O(1) vector<int> SelectSort(vector<int>& nums) { for(int i=0;i<nums.size();i++){ int mini_num=i; //作为一个key //与key后面每个value进行比较 for(int j=i+1;j<nums.size();j++)

Ghost1898688的博客 5333
上一篇: 直接插入排序、希尔排序详解。及性能比较
下一篇: 【八大经典排序算法】选择排序
小白debug~
小白debug~ 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄4年 3510粉丝 128原创
评论 32
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值