经典算法冒泡排序之标志位优化版

news2024/12/30 3:26:57

前言

今天总结一下优化版的经典算法——冒泡排序,不同于以往的暴力二重for循环,这里的冒泡排序增加了一个标志位。我们要理解该冒泡排序的概念,算法流程与算法思想,探讨时间复杂度。

冒泡排序算法解析

一、理解冒泡排序思想

1、算法概念

也称气泡排序,是经典的交换排序方法。整个过程就是在无序区中对相邻元素进行两两比较,将不满足相对顺序的一对儿元素进行交换,再进行下一对元素的比较。

2、算法思想

总结来说,每一趟冒泡排序将会排好一个元素(极值)。不断的在无序区中执行该步骤,如果在某一次比较的过程中没有发生元素的交换,则证明元素都已经有序,可以提前结束整个算法。或者直到无序区中的元素减少到一个时,整个算法结束,此时整个序列有序。

二、算法分析

1、算法流程

假如要对该序列进行冒泡排序,解析一下算法流程:

第一趟排序:7和4 交换位置,变为:

 

第二趟排序:6和4 交换位置,变为:

此时序列符合升序排列,提前结束循环,排序完成,退出循环

2、实现步骤

首先当外层循环 i 为0时,内层循环中从序列里第一个元素开始两两计较,不是升序则交换位置,是升序则往后遍历,那么第一次外层循环一定可以确定最大值且位置在序列末尾。
那么当外层循环次数增多,内层循环范围就要对应缩减,应为总长度 - 外层循环次数 - 1(减1是为了防止 i 等于0时数组溢出)。
重复以上步骤,如果序列已经为升序,通过标志位来提前结束程序。

三、代码实现

1、源码及运行效果

C++源代码:

#include<iostream>
using namespace std;
//冒泡排序声明
void maopaosort(int A[], int len);
//冒泡排序实现
void maopaosort(int A[], int len)
{
    for (int i = 0; i < len; i++) {
        int flag = 0;//标志位
        for (int j = i; j < len - i - 1; j++) {
            if (A[j] > A[j + 1]) {
                int temp = A[j];
                A[j] = A[j + 1];
                A[j + 1] = temp;
                flag = 1;
            }
        }
        if (flag == 0)//如果已经升序,不再继续外层循环,结束此函数
            return;
    }
    return ;
}
int main(void)
{
    int A[7] = { 3,6,7,4,8,9,10 };
    int len = sizeof(A) / sizeof(A[0]);
    cout << "排序前:" << endl;
    for (int i = 0; i < len; i++) {
        cout << A[i] << " ";
    }
    maopaosort(A,len);
    cout << "排序后:" << endl;
    for (int i = 0; i < len; i++) {
        cout << A[i] << " ";
    }
}

运行效果:

 

2、时间复杂度分析

最好的情况:
该序列为升序排列,内层循环执行了n-1次,那么相当于遍历了n次,时间复杂度为O(n)。
最坏的情况:
对于冒泡排序来说,最坏的情况依然是元素逆向有序,此时需要执行n-1趟,并且两两元素都需要交换,相当于是最小的元素排在末尾,—路交换到第一位,然后是次最小一路交换至第二位,此时的时间复杂度为: O(n^2)。
平均情况:
综合考虑下,冒泡排序算法的时间复杂度为O( n^2)

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

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

相关文章

Selenium4+Python3系列(十一) - Page Factory设计模式

写在前面&#xff1a; Page Object模式&#xff0c;目的是将元素定位和元素操作分层&#xff0c;只接触测试内容&#xff0c;不写基础内容&#xff0c;便于后续对自动化测试用例体系的维护&#xff0c;这是中心思想&#xff0c;也是核心。 那么我们继续将简洁延续&#xff0c…

Allegro如何铺网格铜详细操作指导

Allegro如何铺网格铜的三种方法操作指导 在做PCB设计的时候,时常需要铺网格铜,尤其是对于绕性有要求的时候,Allegro可以快捷铺出网格铜,类似下图 具体操作如下 直接铺网格铜 选择Shape add Rect命令 Option Type选择Static Crosshatch 画出需要的图形 鼠标右击done,…

详解go语言包管理方式(go mod), 分析多目录多文件下的管理,不同工程下包的相互调用

先明白一个点&#xff0c; 想要成功运行一个go程序&#xff0c; 有两种模式 一&#xff1a; 以前的默认模式&#xff0c;必须将项目放在gopath/src下 二&#xff1a;使用go mod 包管理方式&#xff0c; 项目可以放到任意位置&#xff0c;这样目录下需要有go.mod文件 下边我会分…

毕业设计 stm32单片机的目标检测与跟踪系统 -物联网 openmv 嵌入式

文章目录0 前言课题简介设计框架3 硬件设计4 软件设计对被测物体的识别判断被测物体所在区域5 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年…

力扣(LeetCode)1812. 判断国际象棋棋盘中一个格子的颜色(C++)

数学 如果我们把国际象棋的横轴看做从 111 到 888 &#xff0c;那么每个棋子的坐标形如 a1(1,1)a1(1,1)a1(1,1) c4(3,4)c4(3,4)c4(3,4) &#xff0c;想想坐标之和有没有什么规律。 规律 : 黑子坐标之和为偶数&#xff0c;白子坐标之和为奇数。 横轴坐标是我们自定义的&#x…

基于蚁群算法的三维路径规划算法以及蚁群算法的优化计算——TSP优化(Matlab代码实现)

目录 1 概述 1.1简介 1.2 改进的蚁群算法 2 部分运行结果 2.1 三维路径规划算法 2.2 TSP优化算法 3 Matlab代码实现 4 参考文献 1 概述 1.1简介 当前社会, 很多用户需要在复杂的没有公路的山地地形, 快速、准确的规划出三维路径, 在避过障碍的同时达到某项指标最优。…

【C++笔试强训】第四天

文章目录选择题编程题选择题 #include<iostream> #include<cstdio> using namespace std; int main(){int m0123, n123;printf("%o %o\n", m, n);return 0; }程序运行后的输出结果是&#xff08;&#xff09; A 0123 0173 B 0123 173 C 123 173 D 173 1…

RabbitMQ基本使用

先会用&#xff0c;知道mq是干嘛的&#xff0c;怎么用RabbitMQ 再去考虑一系列深入东西 一&#xff1a;什么是MQ MQ消息队列详解、四大MQ的优缺点分析_从百草园杀到三味书屋&的博客-CSDN博客 理解什么是MQ MQ在企业/程序中的作用是什么&#xff1f; MQ&#xff0c;中文是…

Fluent的porous jump边界条件

1 porous jump简介 多孔介质指内部具有连通的空洞&#xff0c;可使流体穿过的固体。多孔介质具有以下特点&#xff1a; 流道极复杂&#xff0c;活性炭过滤器等随机排布的多孔介质甚至不存在可通过曲面和实体表征的确定流道多孔介质只是流场的一部分&#xff0c;通常不关注多孔…

DataSphere Studio数据应用开发管理集成框架【DSS基础】

https://github.com/WeBankFinTech/DataSphereStudio/https://gitee.com/WeBank/DataSphereStudio 基于插拔式的集成框架设计&#xff0c;及计算中间件 Linkis &#xff0c;可轻松接入上层各种数据应用系统&#xff0c;让数据开发变得简洁又易用。在统一的 UI 下&#xff0c;Da…

[附源码]Python计算机毕业设计Django中小学课后延时服务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

前端_Vue_2.创建一个Vue应用、模板语法

文章目录一、创建一个Vue应用1.1. 应用实例1.2. 根组件1.3. 挂载应用1.3.1. DOM中的根组件模板1.4. 应用配置1.5. 多个应用实例二、模板语法2.1. 文本插值2.2. 原始HTML2.3. Attribute绑定2.3.1. 简写2.3.2. 布尔型 Attribute2.3.3. 动态绑定多个值2.4. 使用JavaScript表达式2.…

记录一次Sql性能优化

场景&#xff1a; 主业务表 contract&#xff08;合同表&#xff09;&#xff0c;对于不同主体&#xff08;人员&#xff09;&#xff0c;能查看的合同是不一样的。系统企业业务用到了&#xff0c;系统资源表 PERMISSION_RESOURCE 、员工对于资源关系表&#xff1a;ENTRY_JOIN…

物联卡批发为什么那么火爆?

2022年物联网行业开始爆发&#xff0c;针对于企业设备联网的物联卡就显得格外重要了&#xff0c;而共享单车&#xff0c;移动支付&#xff0c;智慧城市&#xff0c;自动售卖机等企业采购物联卡会面临着各种问题&#xff0c;低价陷阱&#xff0c;流量虚假&#xff0c;管理混乱&a…

[Python图像处理] 合成微缩效果

合成微缩效果前言图像微缩效果原理实现图像微缩效果相关链接前言 图像中的模糊效果可以强烈影响被拍摄场景的感知&#xff0c;模糊在传达所需的尺寸和距离感方面起着重要作用。合成微缩 (miniature faking) 是一个使真实大小物体照片看起来像微缩模型照片的过程&#xff0c;也…

java必背综合知识点总结

一、JDK常用的包 java.lang&#xff1a; 这个是系统的基础类&#xff0c;比如String、Math、Integer、System和Thread&#xff0c;提供常用功能。 java.io: 这里面是所有输入输出有关的类&#xff0c;比如文件操作等 java.net: 这里面是与网络有关的类&#xff0c;比如URL,U…

寻找适配网红很迷茫?最全秘笈来了

根据《2022年全球数字概览》报告显示&#xff0c;全球社交媒体用户超过46.2亿&#xff0c;相当于全球总人口的58.4%。全球用户每天在社交媒体上平均花费近2.5个小时&#xff0c;并且每天以2分钟的速度增长。 社交媒体成为全球网民生活中不可或缺的一部分&#xff0c;而对于跨境…

【深度学习】Yolov5训练意外中断后如何接续训练详解;yolov5中断后继续训练

0. 前言 目标检测是计算机视觉上的一个重要任务,下面这篇文章主要给大家介绍了关于Yolov5训练意外中断后如何接续训练的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下 1. 配置环境 操作系统&#xff1a;Ubuntu20.04 CUDA版本&#xff1a;11.4 Pytorch版本…

Excel - 数据分析师所需的最常用公式。

“先打好基础,再细化细节——克里斯安德森” 这将是我正在撰写的关于必须具备数据分析技能的第 4 个也是最后一个“像你 5 岁一样解释”系列。(请观看其他的——Power BI、Python 和 SQL)。现在,我们将具备所需的所有基本技能,然后可以进入数据分析领域的下一阶段 使用 E…

Java实现大乐透不重复数字随机号码生成方案

大乐透攻略Java实现&#xff08;仅供参考学习&#xff09; 购票方式 每期最低购票数&#xff1a;7 张 最低消费&#xff1a;14 元 方案介绍&#xff1a;后区12个数中随机分成6组&#xff0c;且数字不重复。前区35个数随机分成7组&#xff0c;且数字不重复。前区需要7组才能够…