冒泡排序(详解)c++

news/2025/2/24 13:31:53
冒泡排序(Bubble Sort)也是⼀种简单的排序算法。它的⼯作原理是每次检查相邻两个元素,如果前⾯ 的元素与后⾯的元素满⾜给定的排序条件,就将相邻两个元素交换。当没有相邻的元素需要交换时, 排序就完成了。 由于在算法的执⾏过程中,较⼤的元素像是⽓泡般慢慢浮到数列的末端,故叫做冒泡排序

算法思想:

  • 执行 n-1 趟操作,每趟从前往后比较待排序区间的相邻元素如果逆序,就交换。
  • 每趟结束之后,就会有一个较大元素在最终的位置上。

代码实现:

代码测试:P1177 【模板】排序 - 洛谷 

#include <iostream>
using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

void bubble_sort()
{
	// 依次枚举待排序区间的最后一个元素
	for (int i = n; i > 1; --i)  //n-1趟后,第一个也变得有序了
	{
		//[1, i] 就是待排序区间
		for (int j = 1; j <= i; ++j) //当前位置和下一个位置作比较,如果<=i就会和i+1位置作比较,比如排序1 2,结果是0 1
		{
			if (a[j] > a[j + 1])
			{
				swap(a[j], a[j + 1]);
			}
		}
	}
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];

	bubble_sort();

	for (int i = 1; i <= n; ++i) cout << a[i] << " ";
	cout << '\n';

	return 0;
}

优化

当某一趟冒泡操作中,没有执行元素的交换操作时,整个序列就是有序的了没有必要再继续执行冒泡排序算法了,比如1 2 3 4 5 9 8 7 执行了两趟冒泡排序后变成1 2 3 4 5 6 7 8 9升序,此时已是有序序列没有再遍历排序了

#include <iostream>
using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

void bubble_sort()
{
	// 依次枚举待排序区间的最后一个元素
	for (int i = n; i > 1; --i)  //n-1趟后,第一个也变得有序了
	{
		bool flag = true;
		//[1, i] 就是待排序区间
		for (int j = 1; j < i; ++j) //当前位置和下一个位置作比较,如果<=i就会和i+1位置作比较,比如排序1 2,结果是0 1
		{
			if (a[j] > a[j + 1])
			{
				swap(a[j], a[j + 1]);
				flag = false;
			}
		}
        //遍历一趟下来发现已是有序序列
		if (flag) return; 
	}
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];

	bubble_sort();

	for (int i = 1; i <= n; ++i) cout << a[i] << " ";
	cout << '\n';

	return 0;
}

时间复杂度

加上优化之后:
  • 如果数组有序,只会扫描⼀遍,时间复杂度为 O(n
  • 如果逆序,所有元素都会向后冒⼀次到合适位置,时间复杂度为 O(n*n

http://www.niftyadmin.cn/n/5864386.html

相关文章

H5 火柴人科目三和GitHub获取仓库点星星的用户列表发生了艺术的碰撞

先看效果&#xff0c;代码写的比较乱&#xff0c;有待优化 效果 https://linyisonger.github.io/H5.Examples/?name./089.%E7%9C%8B%E6%98%9F%E6%98%9F%E7%9A%84%E8%88%9E%E8%80%85.html 思路 看起来很简单&#xff0c;实则也不是很难&#xff0c;就是需要思路要打开。 一…

QT 基础知识点

1.基础窗口类QMainWindow qDialog Qwidget 随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget 1.1 Qwidget 是所有窗口的基类&#xff0c;只要是他的子类&#xff0c;或子类的子类&#xff0c;都具有他的属性。 右键项目 Add New -> Qt qt设计师界面类&am…

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法&#xff08;Chaotic Evolution Optimization, CEO&#xff09;是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…

DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖

最近是接了一个需求咨询图像处理类的&#xff0c;甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全&#xff0c; 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件&#xff0c;能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…

蓝桥杯 Java B 组之背包问题(01背包、完全背包)

Day 1&#xff1a;背包问题&#xff08;01背包、完全背包&#xff09; &#x1f4d6; 一、背包问题简介 背包问题是动态规划&#xff08;DP&#xff09;中一个经典的优化问题&#xff0c;涉及物品选择和容量约束。通常分为以下几类&#xff1a; 01 背包&#xff08;0/1 Knaps…

49 set与map的模拟实现

目录 一、源码及框架分析 二、模拟实现map和set &#xff08;一&#xff09;复用红黑树的框架&#xff0c;并支持insert &#xff08;二&#xff09;支持迭代器的实现 &#xff08;三&#xff09;map支持 [ ] &#xff08;四&#xff09;整体代码实现 一、源码及框架分析…

【Go】Go wire 依赖注入

1. wire 简介 wire 是一个 Golang 的依赖注入框架&#xff08;类比 Spring 框架提供的依赖注入功能&#xff09; ⭐ 官方文档&#xff1a;https://github.com/google/wire 这里关乎到编程世界当中一条好用的设计原则&#xff1a;A用到了B&#xff0c;那么B一定是通过依赖注入的…

【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示

代码链接 摘要 摘要写作总结&#xff1a; 1.提出 两个关键点 &#xff08;视觉语言模型【模型】 少量工业异常检测【方向】&#xff09; 2.想要解决的问题 3.针对上述问题&#xff0c;本文提出了一种什么【方法】的什么【应用方面】方法【模型名】 4.具体讲方法的步骤 5.实验…