基本排序算法 之一 ——冒泡排序

面试最基本的三种排序算法 冒泡排序 插入排序 选择排序 #include #include #include #include using namespace std; /********创建数组,并输入元素************/ void Random(int a[],int n) { int i=0; srand( (unsigned)time( NULL ) ); while(i<n) { a 阅读详情

 


基本排序算法总结与对比 之一  ——冒泡排序 


1、未改进的冒泡排序 —— 标准冒泡排序

template<typename T>
void bubbleSort(T arr[], int len)
{
    for(int i = 0; i < len - 1; i++)
    {
        for(int j = 0; j < len - 1 - i; j++)
        {
            if(arr[j] > arr[j + 1])
            {
                T temp = arr[j +1];
                arr[j + 1] = arr[j];
                arr[j] = temp; 
            }
        }
    }
}

       未改进的冒泡排序,最好,最坏以及平均情况下的时间复杂度均为O(n^2)。

       排序过程可能在k(k < n - 1)次外循环后已经达到有序状态,但该算法仍然会继续比较相邻元素,直到n - 1次外循环结束。基于以上考虑,提出改进的冒泡排序算法A。

 

2、改进的冒泡排序 A —— 记录数列逆序状态

      如果在k(k < n - 1)次内循环中没有数据交换,即可认为该数列已经达到有序状态。因此排序已经完成,可结束循环。

      设置一个标志位,用来记录数列是否达到有序状态,若达到有序则结束循环。

template<typename T>
void bubbleSort(T arr[], int len)
{
    bool sorted = false;    //先假设整体无序状态
    for(int i = 0; i < len - 1 && !sorted; i++)    //无序状态才会进行循环
    {
        for(int j = 0; j < len - 1 -i; j++)
        {
            sorted = true;    //若以下一次交换都没有,则数列为有序的,有一次交换就会改为false
            if(arr[j] > arr[j + 1])
            {
                T temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
                sorted = false;    //存在一次交换,肯定是无序的;存在一次不交换,不一定是有序的
            }
        }
    }
}

       改进的冒泡排序A,最好的情况下时间复杂度均为O(n),最坏的情况下时间复杂度为O(n^2),平均时间复杂度为O(n^2)。

       但是,排序过程可能在k(k < n - 1)次外循环后,数列的乱序元素仅限于(0,l)区间(l< n ),但是数列整体仍为无序的,每轮循环仍然进行(l,n)区间元素的比较操作。基于以上考虑,提出改进的冒泡排序算法B。

     

3、改进的冒泡排序 B —— 记录最右(或最左)端逆序对位置

        每次循环都保持更新最右端逆序对位置为最近一次元素交换的位置,若在k(k < n - 1)次外循环后,数列的乱序元素仅限于(0,l)区间(l< n ),则在内循环中,从元素l开始,不会再进行交换操作,即最右端逆序对位置在 l 后不会再改变,内循环结束后记录下位置 l,后续排列中将不再考虑 l 右边的元素,即待排序数列缩短为范围(0,l)。

template<typename T>
void bubbleSort(T arr[], int len)
{
    int high, last = len - 1;    //假设最右端逆序对为数列末尾
    while (last > 0)
    {
        high = 0;    //最右端逆序对初始化为0
        for (int j = 0; j < last; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                T temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
                high = j;    //更新最右端逆序对位置
            }
        }
        last = high;    //记录最右端逆序对位置
    }
}

       改进的冒泡排序B,最好的情况下时间复杂度均为O(n),最坏的情况下时间复杂度为O(n^2),平均时间复杂度为O(n^2)。

       在乱序元素仅限于A[0, l)区间时,仅需一趟扫描交换,即可将问题范围缩减至这一区间。累计耗时:O(n + l^2) = O(l^2)。

       同理,排序过程可能在k(k < n - 1)次外循环后,数列的乱序元素仅限于[l,n)区间(l< n ),但是数列整体仍为无序的,每轮循环仍然进行[0,l)区间元素的比较操作。基于以上考虑,可以基于算法B修改,使扫描过程从尾部开始,向左边记录最左端逆序对位置即可。

       基于以上总结,算法B可进一步拓展为排序过程可能在k(k < n - 1)次外循环后,乱序元素仅限于(l,m)区间(0 ≤ l < m ≤ n)的情形,结合算法B及其修改,提出改进的冒泡排序算法C。

 

4、改进的冒泡排序 C —— 双向扫描 记录两端逆序对位置

       每次循环双向扫描,并保持更新最右端逆序对和最左端逆序对位置为最近一次元素交换的位置,若在k(k < n - 1)次外循环后,数列的乱序元素仅限于(l,m)区间(0 ≤ l < m ≤ n),则在内循环中,向左从l开始,向右从m开始,不会再进行元素交换。即最右端逆序对位置记录为m,最左端逆序对位置记录为l,后续排列将仅仅考虑(l,m)区间元素。

template<typename T>
void bubbleSort(T arr[], int len)
{
    int first = 0, last = len - 1;
    int low, high;
    while(first < last)
    {
        high = first, low = last; 
        
        //向右扫描
        for(int i = first; i < last; i++)
        {
            if(arr[i] > arr[i + 1])
            {
                T temp = arr[i + 1];
                arr[i + 1] = arr[i];
                arr[i] = temp;
                high = i;
            }
        }
        last = high;    //记录last 放在左向扫描前面,右端有序的子数列不再进行左向扫描!

        //向左扫描
        for(int j = last; j > first; j--)
        {
            if(arr[j] < arr[j - 1])
            {
                T temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
                low = j;
            }
        }
        first = low;
    }
}

       改进的冒泡排序C,最好的情况下时间复杂度均为O(n),最坏的情况下时间复杂度为O(n^2),平均时间复杂度为O(n^2)。

       在乱序元素仅限于A(l, m)区间时,仅需两趟扫描交换,即可将问题范围缩减至这一区间。累计耗时:O(n + m + (m-l)^2) = O((m-l)^2)。

 

       冒泡排序法的改进仅仅是该算法的内部改进,无论怎么改进,平均情况下的时间复杂度均为O(n^2),效率并没有从根本上提升。但是改进使得数列排序在某些情形下减少多余操作,从而减少耗时。

项目经理面试 5 大高频题 + 实战回答模板,帮你稳拿 offer 项目经理面试5大高频问题及应答技巧 摘要:本文总结了项目经理岗位常见的5个面试问题及回答策略,帮助求职者更有针对性地准备面试。核心问题包括:1)描述负责过的典型项目;2)常用项目管理工具;3)项目遇到的挑战及解决方案;4)风险管理方法;5)项目成功标准。每个问题都从面试官考察重点、回答技巧、实战案例三个维度进行分析,强调要用STAR法则(情境-任务-行动-结果)结构化表达,突出解决问题的能力而非简单罗列经历。特别提醒要量化项目成果(如提前2周上线、节省8%预算等),并注意展示商业思维和团队协作能力。 阅读详情

相关推荐

STM32F030C8烧录实战:用J-Link Commander实现一键批量烧写(附完整脚本)

本文详细介绍了如何使用J-Link Commander工具链实现STM32F030C8的一键批量烧录,包括环境配置、批处理脚本设计、命令脚本解析以及生产环境实战技巧。通过自动化烧录流程,显著提升效率并降低人为错误,特别适合量产和频繁迭代的开发场景。

weixin_30505225的博客 461

排序——冒泡排序(Bubble sort)

定义 冒泡排序是一种较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 ...

努力中的老周的专栏 1万+

Autodesk全家桶:从AutoCAD到Maya,设计师必备的7款神器全解析

本文全面解析Autodesk全家桶中的7款设计师必备软件,包括AutoCAD、Revit、Inventor、Fusion 360、Maya和3ds Max等。从二维制图到三维建模,从建筑信息模型(BIM)到影视动画制作,这些工具在工程设计、建筑可视化和数字创意领域展现出强大的协同效应。通过实战案例展示如何整合工作流,显著提升设计效率与项目质量。

weixin_29237635的博客 460

java冒泡排序以及乱序

java冒泡排序以及乱序输出

小段的博客 247

S7-1200五轴伺服系统PLC控制方案与调试技巧

工业自动化领域中,多轴伺服控制是实现精密加工的核心技术。基于PROFINET实时通信协议和PLCopen运动控制标准,现代PLC(如西门子S7-1200)能够实现多轴高精度同步控制。其技术原理是通过等时同步模式确保各轴运动的时序一致性,结合PID调节和电子齿轮比实现位置闭环。这种方案在数控机床、3D打印等场景具有重要应用价值。本文以五轴联动系统为例,详细解析了S7-1200与V90伺服驱动器的硬件组态方案,包括PROFINET环网配置和IRT同步设置。在软件层面,重点介绍了基于TIA Portal的工艺对象

weixin_34332905的博客 415

MobilenetV1、V2、V3系列详解

Mobilenet系列模型作为当前主流的端侧轻量级模型被广泛应用,很多算法都会使用其作为backbone提取特征,这一章对Mobilenet系列模型V1,V2,V3做一个总结。

turned的博客 1万+

冒泡排序以及随机乱序

编写程序,对数组进行排序,使用冒泡法排序,并增加随机性,使得数组乱序输出。 package com.liaojianya.chapter1; import java.util.ArrayList; import java.util.List; import java.util.Random; /** * This program demonstrates the sort...

weixin_34120274的博客 208

计算机视觉与深度学习实战:以Python为工具,基于帧间差法进行视频目标检测

计算机视觉是一门研究如何使机器从数字图像或视频中提取、分析和理解有用信息的学科。它涉及图像处理、计算机图形学、人工智能等多个领域的知识。通过计算机视觉技术,我们可以实现图像的识别、分类、目标检测等功能。本文介绍了计算机视觉与深度学习的基本概念和原理,并以Python为工具,基于帧间差分法实现了视频目标检测。帧间差分法具有算法实现简单、程序设计复杂度低、对光线等场景变化不太敏感等优点,因此在实际应用中得到了广泛的应用。然而,帧间差分法也存在一些局限性,如对于缓慢移动或静止的物体检测效果不佳。

一个好知识的传播者 1256

对数组进行冒泡排序后乱序输出

package com.zys; import java.util.*; public class Solution { //对数组进行排序,使用冒泡排序法,并增加随机性,使得数组乱序输出 public static void sort(int[] arr) { System.out.print("排序前:"); for (int i = 0;...

Rachelsalaheiyo的博客 607

保姆级教程:用ComfyUI+LTX-Video插件,5分钟搞定你的第一个AI视频(RTX 4060实测)

本文提供了一份详细的ComfyUI与LTX-Video插件使用指南,帮助用户在RTX 4060显卡上快速生成AI视频。从环境部署到图形化操作,再到提示词优化和性能调优,全面覆盖AI视频生成的各个环节,让零基础用户也能轻松上手。

weixin_33743661的博客 136

sap销售发货的流程_SAP销售订单发货后如何实现发票的自动创建?

问SAP销售订单发货后如何实现发票的自动创建?答业务场景有些快消零售企业,SAP系统单据量大,单据金额少,一般在销售发货后即可确认收入。此时无需人工在系统内操作VF01或者VF04进行开票操作,可将该操作设置成后台作业进行自动批量开票,具体操作如下:1、定义任务:VF06输入完以上信息,点击保存进入以下界面:说明:当前日期的意思是“开票的日期”等于“系统电脑中的当前日期”当前日期+/-...

weixin_42358409的博客 3363

基本排序算法:冒泡排序

基本排序算法:冒泡排序 冒泡排序 冒泡排序是最慢的排序算法之一, 也是最容易实现的排序算法.使用这种算法进行排序时,数据值会像气泡一样从数组的一端漂浮到另一端,所以称之为冒泡排序.假设要对数组按照升序排列,较大的值会浮动到数组的右侧,较小值会浮到左侧. 原理 简单来说就是相邻两个元素进行对比,按照你需要的排序方式(升序or降序)进行位置替换,替换时需要额外一个变量当作中间变量去暂存值。 冒泡排序动图演示: 实现方式: 一、双重for循环 两两对比进行替换 function bubbleSort(arr)

guoqkmiss的博客 438

进阶06:C#连接TwinCAT 3使用ADS通讯

本文介绍了使用C#通过ADS协议与倍福TwinCAT3 PLC通讯的实现方法。主要内容包括:1)在两台电脑上安装TwinCAT3开发环境并建立网络连接;2)在TwinCAT中定义变量和结构体;3)使用C# Winform开发界面,通过TwinCAT.Ads.dll实现读写功能;4)实现主动读取和通知两种数据获取方式。详细说明了连接建立、变量定义、读写操作及事件通知的实现代码。该方案实现了对PLC寄存器数据的实时监控和操作,为工业控制系统的开发提供了参考。

weixin_38637405的博客 3688

Python3 基本排序算法 之 冒泡排序,插入排序,选择排序

目录 基本排序算法按时间复杂度分类 冒泡排序 插入排序 选择排序 基本排序算法按时间复杂度分类 O(n^2) 冒泡排序 插入排序 选择排序 Q(n log n) 分而治之 快速排序 归并排序 冒泡排序 相邻的两个元素对比,大的数后推,遍历整个列表一次后,将最大项以冒泡的方式排列到列表末尾。 简易版冒泡排序示例如下 def bu...

E.W的博客 6579

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

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

基本排序算法之冒泡排序

冒泡排序是交换排序的一种。 所谓交换,是指根据序列中的两个元素关键字的比较结果来对换这两个记录在序列中的位置。基于交换的排序算法很多,包括冒泡和快排。 算法思想 从后往前(或从前往后)两两比较相邻元素的值,若为逆序,则交换它们,直到序列比较完。我们称它为第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置(或将最大的元素交换到待排序列的最后一个位置),下一趟冒泡时,前一趟确定的最小元素(或最大元素)不再参与比较,每趟冒泡的结果是把序列中的最小元素(或最大元素)放到了序列的最终位置…因此这样最多需要n-1

个人学习记录 639

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java基本算法《排序算法:冒泡排序》

冒泡排序 package JavaNote001; import java.util.Arrays; import java.util.Scanner; // 排序算法中的冒泡排序 public class ArrayListBubbleSort{ public static void main(String[] args) { int [] m = intiList...

qq_45061361的博客 202

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java中八种基本的排序算法之冒泡排序

Java中八种基本的排序算法: /** * 排序算法: * 1.插入排序(直接插入排序、希尔排序) * 2.交换排序(冒泡排序、快速排序) * 3.选择排序(直接选择排序、堆排序) * 4.归并排序 * 5.分配排序(基数排序、箱排序) * * 所需辅助空间最多:归并排序 * ...

SC的博客 338

Java三大基本排序算法之冒泡排序

今天我们一起学习排序算法中的冒泡排序,还是比较有意思的,也是比较简单的一种。

m0_73233110的博客 462

8 基本排序算法:冒泡排序与快速排序

一、冒泡排序 原理 冒泡排序是一种简单的交换类排序方法,能够将相邻的数据元素进行交换,从而逐步将待排序序列变成有序序列。冒泡排序的基本思想是:从头扫描待排序记录序列,在扫描的过程中顺次比较相邻两个元素的大小。 下面以升序为例介绍排序过程: 1.在第一趟排序中,对n个记录进行如下操作。 ①对相邻的两个记录的关键字进行比较,逆序时就交换位置。 ②在扫描的过程中,不断向后移动相邻两个记录中关键字较大的记...

gofuncchan的博客 878

八大基本排序算法java实现之冒泡排序

冒泡排序的思想: 从第一个元素开始每一个元素与其后面紧挨的元素相比较,若前面元素大于后面元素则交换两元素的值(从小到大排序)第一躺遍历完所有元素之后,最大的值即排到了最后 再进行下一趟遍历,知道所有元素都排好序。

swenke的博客 380

三种基本排序算法-冒泡排序,选择排序,插入排序

三种基本排序算法-冒泡排序,选择排序,插入排序的基本思想及代码实现,代码均已上级运行实现排序功能。

虚心求学 1348

Java基本排序算法汇总之(1)冒泡排序

冒泡排序 冒泡排序是一种交换排序。也就是说:两两比较待排序的关键字,并交换不满足次序要求的那一对数,直到整个表都满足次序要求为止。 下面演示一下冒泡排序的实际流程: 假设有一个无序序列 { 4. 3. 1. 2. 5 } 如果从前往后排,就会逐步把每一轮比较出来最大的数放在最后面 第一趟排序:结果为{ 3. 1. 2. 4. 5 },通过两两比较,找到该轮比较出来最大的数值 4 ,将其放在序列...

weixin_44160155的博客 206

基本排序算法:桶排序、冒泡排序、快速排序

/** * 排序算法,包括桶排序,冒泡排序,快速排序 * Created by 大漠dreamer on 2019/3/26. */ public class SortTest { private static final String TAG = SortTest.class.getSimpleName(); private int[] array = {3, 1, ...

Adversity reveals genius; fortune conceals it. 473

Python3 基本排序算法之冒泡排序,插入排序,选择排序

  基本排序算法按时间复杂度分类  O(n^2)  冒泡排序  插入排序  选择排序  Q(n log n)  分而治之  快速排序  归并排序  冒泡排序  相邻的两个元素对比,大的数后推,遍历整个列表一次后,将最大项以冒泡的方式排列i到列表末尾。  简易版冒泡排序示例如下  def bubble(sl):  """  冒泡排序,O(n^2)  相邻的两个元素对比,大的后推...

bduwps8393的博客 201

两种基本排序算法——循环语句实现选择和冒泡排序的执行过程输出

- 初学python编程,练习用循环语句实现列表排序,常常被“选择排序”和“冒泡排序”2种基本排序思路懵逼 - 将执行过程中每一次比较的说明和结果输出,类似于反《九九乘法表》的格式 - 供大家参考:提供思路、加深理解

weixin_45221012的博客 573

基本排序算法——直接插入排序、冒泡排序、快速排序

直接插入排序 基本思想: 排序过程中,将无序区中第一条记录插入到有序区中适当的位置,使其保持有序。 以数据表(9,3,1,4,2,7,8,6,5)为例,直接插入排序如下图: 算法代码实现如下: void InsertSort(list R,int n){ int i,j; for(i = 2;i <= n;i++){ if(R[i].ke

鸡肉味嘎嘣脆 2288
上一篇: 十大排序基础排序算法总结 与 速度对比
下一篇: 基本排序算法 之二 ——选择排序
晨晚_
博客等级 码龄9年 10粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值