排序算法之冒泡排序

排序算法:冒泡排序 前言 对于Java程序员来说,一般对于算法没有什么要求,但是有一个算法除外——排序算法。排序算法不仅在日常开发中经常用到,还是面试中几乎必问的题目,并且通常是以“手写代码”的形式出现,因此掌握好排序算法是对每一个程序员的最基本要求。 谈到排序算法,第一个浮现在我们脑中的一定是“冒泡排序”。“冒泡排序”由于较简单的过程,得到大多数程序员的“厚爱”,本文将简单的介绍排序算法的整个过程。 ... 阅读详情

思路

假设有一个长度为 nnn 的数组 aaa 。
冒泡排序的执行过程如下:

首先,设 r=n−1r=n-1r=n−1 。

  1. 遍历一遍 a0⋯ara_0\cdots a_{r}a0​⋯ar​ 比较相邻的两个数(ai,ai−1(0≤i<r)a_i,a_{i-1}(0\le i< r)ai​,ai−1​(0≤i<r)),若 ai>ai+1a_i>a_{i+1}ai​>ai+1​ 则交换 aia_iai​ 与 ai+1a_{i+1}ai+1​。
  2. 做完 1. 后,最大值肯定在最后面,下次遍历不用管,所以 rrr 减少 111。
  3. 每次都对越来越少需要操作的元素进行操作,直到没有需要操作的元素为止。

代码

#include <iostream>
using namespace std;
int a[int(1e7)];
void BubbleSort(int *a, int n) {
	for (int i = 0; i < n - 1; ++i)
		for (int j = 0; j < n - i - 1; ++j)
			if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);
}
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) cin >> a[i];
	BubbleSort(a, n);
	for (int i = 0; i < n; ++i) cout << a[i] << ' ';
	return 0;
}

优化

假如从 axa_xax​ 之后的区间是有序的,那么再去对该区间做冒泡是没有意义的,应当立即退出。可以维护布尔变量 bbb,假如发生了交换(说明后面的数组可能无序)直接退出。

#include <iostream>
using namespace std;
int a[int(1e7)];
void BubbleSort2(int *a, int n) {
	for (int i = 0; i < n - 1; ++i) {
		bool b = 0; 
		for (int j = 0; j < n - i - 1; ++j)
			if (a[j] > a[j + 1]) {
			    swap(a[j], a[j + 1]);
			    b = 1; // 有交换说明后面的数组可能无序 
			}
		if (!b) break; // 假如没有交换说明后面数组已经有序,再排序没有意义,直接退出 
	} 
}
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) cin >> a[i];
	BubbleSort2(a, n);
	for (int i = 0; i < n; ++i) cout << a[i] << ' '; 
	return 0;
}

优化之后,最好时间复杂度是 O(n)O(n)O(n) (aaa已经是有序的)。
最坏复杂度仍是 O(n2)O(n^2)O(n2) (aaa 是逆序的)。

排序算法-常用的排序算法冒泡排序优化 排序算法 冒泡排序优化 阅读详情

相关推荐

python实现排序算法——冒泡排序

       使用python实现冒泡排序算法,冒泡排序法是非常经典并且非常简单有效的排序算法。首先我们介绍一下冒泡排序算法。 算法步骤: Step 1: 比较第一个数和第二个数,如果第一个数比第二个数大,那么就调换两个数的位置。 Step 2: 按照step 1中的做法,依次比较序列中所有相邻的两个数。此时,序列中最大的数已经“沉”到了最后面。 Step...

海军上将光之翼的博客 1268

Python排序算法之冒泡排序

冒泡排序是一种简单直观的排序算法;它重复的遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复的进行直到不再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经过交换慢慢“浮”到数列的顶端。比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。

程序员小芽的博客 8659

排序算法 - 冒泡排序

本文介绍了冒泡排序的基本原理和 Java 实现,并对算法进行了优化。冒泡排序通过比较相邻元素并交换位置,使最大元素 “冒泡” 到数组末尾,重复 n-1 趟排序后实现数组升序。本文最后对冒泡排序进行了复杂度和稳定性的评估并指出该算法的优缺点和适用情况。

iguyi的博客 1151

【排序算法】冒泡排序

冒泡排序是一种简单但低效的排序算法。它重复地走访要排序的元素列,一次比较两个元素,如果它们的顺序错误就交换它们,直到没有元素需要交换。这个过程类似于气泡在水中上浮的过程,因而得名冒泡排序。冒泡排序的实现非常简单,但效率较低,特别是在大型数据集上。它的时间复杂度为O(n^2),其中n是要排序的元素个数。尽管如此,在某些特定情况下,冒泡排序仍然是一种简单且有效的选择。下面我将详细介绍冒泡排序的原理、实现以及一个Java语言的示例。冒泡排序是一种简单直观的排序算法,但其时间复杂度较高,特别是在数据量较大时。

lmj3732018的博客 4945

MATLAB去雾算法实战:5种经典方法对比+1种改进方案(附完整源码)

本文详细对比了MATLAB中5种经典去雾算法(包括暗通道先验、多尺度Retinex等)的实现效果,并提出一种创新的自适应融合改进方案。通过完整的源码展示和性能对比,帮助开发者掌握图像去雾的核心技术,提升计算机视觉应用中的图像质量。特别针对去雾算法中的光晕效应问题,给出了工程实践中的优化技巧。

weixin_26801149的博客 412

SAP VF01开票报错:出口贸易数据不完整

找了半天资料,最后发现是没有维护凭证抬头的数据;由于我不是SD模块顾问,整体流程使用的是原本环境里面的数据,用新建工厂引用,所以也不知道为啥会出发这个贸易业务。正常传到FICO模块,生成会计凭证、获利分析、利润中心及CO凭证。需要维护这三个字段后才能正常转到FI生成会计凭证。VF01开票报错:出口贸易数据不完整。

MaiKouBei的博客 1540

排序算法之一 冒泡排序(Bubble Sort)

概述 冒泡排序是一种极其简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。尽管冒泡排序是最容易了解和实现的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。 算法描述 1.比较相邻的元素,如果前一个比后一个大,就把它们两个对调...

Markus 2599

【C++】C++异常语法、使用、规范、异常安全及异常的优缺点

实际中我们可以可以去继承exception类实现自己的异常类。但是实际中很多公司像上面一样自己定义一套异常继承体系。因为C++标准库设计的不够好用。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。异常是一种处理错误的方式,

weixin_51692487的博客 1524

【十大排序算法】冒泡排序

在排序的大海上,冒泡排序像一朵花朵般绽放, 每个元素都像是水珠,跃动在涟漪的波浪中。 它们轻轻上浮,与周围的元素相比较, 若自身更大,便悄然交换位置。 这是一场缓慢的舞蹈,每一步都小心翼翼, 直到所有元素都找到了自己的位置, 像是夜空中闪烁的星星,它们最终静静地排列, 形成了一个美妙的序列,闪耀着排序的光芒。

DC1020的博客 1355

双轮差动机器人SLAM实战:轮速里程计从建模到精度验证(附Matlab代码)

本文详细介绍了双轮差动机器人SLAM系统中轮速里程计的实现全流程,包括核心原理、建模方法、Matlab代码实现及精度验证。通过轮速仪数据建模和连续积分算法,提升定位精度,并附有完整的误差分析和工程优化技巧,为开发者提供实用参考。

weixin_29050271的博客 223

R语言Rstudio突然无法启动且报错:ERROR system error 42 [str: 一, len: 3, from: UTF-8, to: ISO8859-1]...如何解决

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2846

常见排序算法——冒泡排序和选择排序

选择排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。

java小豪的博客 5411

基于 YOLOv26 的金属表面缺陷检测系统:智能视觉质检方案

摘要: 基于YOLOv26的金属表面缺陷检测系统采用深度学习技术,实现对划痕、裂纹、腐蚀等8类常见缺陷的自动化检测。系统通过数据增强预处理和YOLOv26模型的高精度识别能力,具备多类别分类、实时推理和强鲁棒性特点,适用于不同金属材质与光照条件。架构包含数据采集、预处理、YOLOv26检测和后处理模块,代码实现采用PyTorch框架,支持训练数据增强与标准化处理,为工业质检提供高效智能解决方案。

一键难忘的博客 589

排序算法总结之冒泡排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它的基本思想就是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 例如:初始序列3,6,4,2,11,10,5;从头开始,两两相比

生命在于折腾 2324

若依开源系统多数据源整合clickhouse数据库详细步骤

若依开源系统多数据源整合clickhouse数据库详细步骤

java之书-资源 897

2024年12月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

他尝试编写了如下程序,请你完善划线处的代码,计算出在h点s分放学时,三个时针分别经过3点位置的次数,用一个元组表示各指针经过3点位置的次数 (时针次数,分针次数,秒针次数) ,并输出。所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。匿名函数,冒号之前表示的是这个函数的参数,冒号之后表示返回值,可以使用默认值,使用时需要将它赋值给一个变量,设置默认值不是必须,如无传入实参则使用默认值,如有传入实参则使用实参。

人生就是一个不断学习的过程 370

数据结构与算法-排序算法1-冒泡排序

排序也称为排序算法。排序是将一组数据依据指定的顺序进行排列的过程。内部排序:将需要处理的所有数据都加载到内存中进行排序。外部排序:数据量过大(比如10亿个数据),无法全部加载到内存中,就需要借助外部存储(文件、磁盘等)进行排序。先加载一部分,排序完之后再加载另外一部分进行排序,排序完再合并。数组中n个元素,从数组第一个元素开始到最后一个元素,依次比较相邻元素的值,如果如果左端元素大于右端元素就交换它们的位置,使得较大的元素在右边。这样数组最右端的元素就是数组中的最大元素。

nameofworld的博客 1504

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

排序算法——冒泡排序

冒泡排序 冒泡排序是我学习的第二个排序算法 它的特点是,每组所需要的数据都会像吐泡泡一样向上冒出 看下面的例子 若有一个数组m = [5, 3, 4, 2, 1],将其从小到大排列 5 3 4 1 2 5 3 1 4 2 5 1 3 4 2 1 5 3 4 2 第一轮排序将1冒泡到最前面 1 5 3 2 4 1 5 2 3 4 1 2 5 3 4 第二轮排序将2冒泡到第二个位置 1 2 5 3 4 1 2 3 5 4 第三轮排序将3冒泡到最前面 1 2 3 5 4 1 2 3 4 5 最后一轮排序将4

私のBookShelf 256

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 匹配括号(平衡括号序列)
下一篇: 排序算法之插入排序
peter_code
博客等级 码龄5年 41粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值