冒泡排序的算法分析与改进

基于ESP32的智能健康监测系统开发 本文介绍了如何基于ESP32开发智能健康监测系统,从硬件选型、系统架构到软件实现的每一个环节。通过ESP32的Wi-Fi功能、传感器模块和云平台的结合,我们实现了实时健康数据监测、远程查看、报警等功能。系统的低功耗特性使得其适用于长期健康监测,能够为用户提供更便捷的健康管理方案。随着技术的不断发展,未来智能健康监测系统将进一步发展。例如,增加更多的传感器,提升数据分析能力,甚至通过人工智能算法来预测用户的健康趋势,为用户提供个性化的健康建议。 阅读详情
冒泡排序的算法分析与改进

交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
 应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。

冒泡排序

1、排序方法

将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
(1)初始
  R[1..n]为无序区。

(2)第一趟扫描
  从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。
 第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。

(3)第二趟扫描
  扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……
 最后,经过n-1 趟扫描可得到有序区R[1..n]
注意:
  第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到顶部位置R[i]上,结果是R[1..i]变为新的有序区。

2、冒泡排序过程示例
 对关键字序列为49 38 65 97 76 13 27 49的文件进行冒泡排序的过程【参见动画演示】

3、排序算法
(1)分析
 因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。
 若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为FALSE。若排序过程中发生了交换,则将其置为TRUE。各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。

(2)具体算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序
int i,j;
Boolean exchange; //交换标志
for(i=1;i<n;i++){ //最多做n-1趟排序
exchange=FALSE; //本趟排序开始前,交换标志应为假
for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描
if(R[j+1].key<R[j].key){//交换记录
R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
R[j+1]=R[j];
R[j]=R[0];
exchange=TRUE; //发生了交换,故将交换标志置为真
}
if(!exchange) //本趟排序未发生交换,提前终止算法
return;
} //endfor(外循环)
} //BubbleSort
4、算法分析
(1)算法的最好时间复杂度
 若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
Cmin=n-1
Mmin=0。
 冒泡排序最好的时间复杂度为O(n)。

(2)算法的最坏时间复杂度
 若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
Cmax=n(n-1)/2=O(n2)
Mmax=3n(n-1)/2=O(n2)
 冒泡排序的最坏时间复杂度为O(n2)。

(3)算法的平均时间复杂度为O(n2)
 虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。

(4)算法稳定性
 冒泡排序是就地排序,且它是稳定的。

5、算法改进
 上述的冒泡排序还可做如下的改进:
(1)记住最后一次交换发生位置lastExchange的冒泡排序
  在每趟扫描中,记住最后一次交换发生的位置lastExchange,(该位置之前的相邻记录均已有序)。下一趟排序开始时,R[1..lastExchange-1]是有序区,R[lastExchange..n]是无序区。这样,一趟排序可能使当前有序区扩充多个记录,从而减少排序的趟数。具体算法【参见习题】。

(2) 改变扫描方向的冒泡排序
①冒泡排序的不对称性
  能一趟扫描完成排序的情况:
 只有最轻的气泡位于R[n]的位置,其余的气泡均已排好序,那么也只需一趟扫描就可以完成排序。
【例】对初始关键字序列12,18,42,44,45,67,94,10就仅需一趟扫描。
需要n-1趟扫描完成排序情况:
  当只有最重的气泡位于R[1]的位置,其余的气泡均已排好序时,则仍需做n-1趟扫描才能完成排序。
【例】对初始关键字序列:94,10,12,18,42,44,45,67就需七趟扫描。

②造成不对称性的原因
  每趟扫描仅能使最重气泡"下沉"一个位置,因此使位于顶端的最重气泡下沉到底部时,需做n-1趟扫描。

③改进不对称性的方法
 在排序过程中交替改变扫描方向,可改进不对称性。具体算法【参见习题】。 

 

 

我的代码示例:


public class BubbleSort {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Integer[] a = new Integer[]{23,4,5,34,3,1};
  int compareTimes = bubbleSort(a);
  print(compareTimes,a);
  
  Integer[] b = new Integer[]{1,2,3,4,5,6};
  compareTimes = bubbleSortWithFlag(b);
  print(compareTimes,b);
  
  Integer[] c = new Integer[]{2,5,3,7,8,9,10};
  compareTimes = bubbleSortWithLastExchange(c);
  print(compareTimes,c);
 }

 private static void print(int compareTimes, Integer[] a) {
  // TODO Auto-generated method stub
  System.out.println("*****************"+compareTimes+"**************");
  for (int i = 0; i < a.length; i++) {
   System.out.println(a[i]);
  }
 }

 private static int bubbleSort(Integer[] a) {
  // TODO Auto-generated method stub
  //loop length-1 times
  int compareTimes = 0;
  for (int i = 0; i < a.length-1; i++) {
//   campareTimes++;
   for (int j = 0; j < a.length-i-1; j++) {
    compareTimes++;
    if(a[j]>a[j+1]){
     int temp = a[j];
     a[j]=a[j+1];
     a[j+1]=temp;
    }
   }
  }
  return compareTimes;
 }
 
 private static int bubbleSortWithFlag(Integer[] a){
  int compareTimes = 0;
  for (int i = 0; i < a.length-1; i++) {
   boolean isExchange = false;
//   campareTimes++;
   for (int j = 0; j < a.length-i-1; j++) {
    compareTimes++;
    if(a[j]>a[j+1]){
     int temp = a[j];
     a[j]=a[j+1];
     a[j+1]=temp;
     isExchange = true;
    }
   }
   if (!isExchange) {
    break;
   }
  }
  return compareTimes;
 }
 
 private static int bubbleSortWithLastExchange(Integer[] a){
  int compareTimes = 0;
  int lastExchange = a.length-1;
  for (int i = 0; i < a.length; i++) {
   int b = 0;
   for (int j = 0; j < lastExchange; j++) {
    compareTimes++;
    if(a[j]>a[j+1]){
     int temp = a[j];
     a[j]=a[j+1];
     a[j+1]=temp;
     b=j;
    }
   }
   lastExchange = b;
  }
  return compareTimes;
 }

}

实验三、数字PID控制器的设计 由图可知,由于微分环节的作用,在曲线的起始上升段出现了一个尖锐的波峰,之后曲线也呈衰减的振荡:随着Td增加,系统的超调量增大,但曲线尖锐的起始上升阶段后响应速度减慢,可以看出Td越小。对大多数算法,缩短采样周期可使控制回路性能改善,但采样周期缩短时,频繁的采样必然会占用较多的计算工作时间,同时也会增加计算机的计算负担,而对有些变化缓慢的受控对象无需很高的采样频率即可满意地进行跟踪,过多的采样反而没有多少实际意义。随着Kp的增加,闭环系统的超调量增加,响应速度加快,控制时间加长,稳态误差减少; 阅读详情

相关推荐

树莓派4B玩转ROS2 Humble:Ubuntu Desktop一键安装与配置教程

本文详细介绍了在树莓派4B上安装和配置ROS2 Humble的完整教程,包括硬件准备、Ubuntu Desktop系统安装、一键部署ROS2、网络配置优化以及常见问题解决方案。通过简化安装流程和性能调优技巧,帮助开发者快速搭建机器人开发环境,充分发挥树莓派4B在ROS2应用中的潜力。

w8x9y0z1的博客 963

冒泡排序算法与改进的冒泡排序算法

对存放在数组的数据,按从前往后的方向进行多次扫描,当发现两个相邻的数据排序与要求的排序不相符时交换这两个数的位置,以从小到大的排序要求为例,这样较小的数据就会冒上来(称为冒泡排序)。每趟排序都会减少一个待排序的数,所以比较次数为n-i-1。从举例的结果可以看出,在进行完第四次排序后已经有序,所以不必继续进行下面的排序(继续进行排序,只进行数值的比较而数据不会移动)。i=1 第二趟排序: 0 1 2 6 8 4。i=3 第四趟排序: 0 1 2 4。...

m0_64529905的博客 1962

IEEE Access 上岸指南,附含泪整理的 cover letter 、沟通邮件、终版文档等资料包

终于上岸了! 我是一个小硕,本科期间发表过两篇水文,奈何学校有更高的毕业要求,只能硬着头皮尝试一下 SCI。 想投 IEEE Access 的朋友都应该知道 小木虫论坛 对这个期刊的讨论,褒贬不一,有的人说是大水刊,有的人说有难度。 比如: @wow_: 不可否认,灌水期刊。只要之前中过一篇,再投基本没有不录用的!我们实验室其他老师说过一区除外的收费期刊都应该禁止灌水。 @pssp: 审稿人还...

kurryluo的博客 1万+

冒泡算法及其改进算法

冒泡算法及其改进算法冒泡算法介绍改进算法1改进算法2结果比较 冒泡算法介绍 冒泡算法的原理是:根据轻气泡不能在重气泡之下的原则,按一定顺序扫描数组:凡扫描到违反本原则的轻气泡,就使其向上&amp;amp;quot;飘浮&amp;amp;quot;。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。到此排序结束。 比如对{6,2,3,1,7}进行冒泡排序(从小到大) 第一次遍历结束后,结果为:1 6 3 2 7 第二次遍历结束后,结果为:...

bajianxiaofendui的博客 1万+

离散数学期末复习笔记【精华版】

文章目录前言一、????理逻辑1. 命题逻辑2. 等值演算3. 主合取范式、主析取范式4. 【题】推理证明5. 辖域、自由变元、约束变元二、????合1. 环和、环积,幂集,笛卡尔乘积三、 ????????关系1. 自反、对称、传递2&3. 合成运算,逆关系、闭包4. 哈斯图、上下界、偏序5. 等价关系、划分四、????1. 幺元(么元、单位元)、零元、逆元,半群、群、阿尔贝群、独异点、循环独异点2. 【题】由表判断3. 【题】证明五、????论1. 简单图、平凡图、多重图、子图、补图、出度、入度、

林大夕可的博客 17万+

微软Media Creation Tool 创建工具 1.3 升级:支持全新下载安装Win11 22H2 Build 22621.525

微软 Media Creation Tool 创建工具 1.3 升级:支持全新下载安装 Win11 22H2 Build 22621.525 ISO 镜像,如果今天运行使用 Media Creation Tool,则会下载 Windows 11 2022 版本 Build 22621.525,它不会向操作系统添加任何新内容,但会修复安装问题,下面来看看详细的更新内容。

zym0218的博客 4231

数据结构学习笔记——交换排序(冒泡排序和快速排序)

交换排序通过两两比较待排序的元素,若不满足排序要求则进行交换,直到整个序列有序为止。 # 一、冒泡排序 ## (一)排序思想 按照一定的次序(从前往后或从后往前,对应递减和递增)两两比较相邻的元素,若为逆序(r[i-1]r[i+1]),则进行交换,直到整个序列都比较完结束,即第一趟冒泡排序结束【第一趟冒泡排序后有一个最小或最大的元素放在排序的最终位置】。然后,继续进行下一趟冒泡排序,之前确定的最小或最大元素则不参与排序比较,第二趟后同样,序列中有一个最小或最大的元素放在排序的最终位置,

小宇y的博客 4082

YOLOv11 改进 - C2PSA | C2PSA融合TSSA(Token Statistics Self-Attention)令牌统计自注意力,优化遮挡目标感知

本文介绍了Token Statistics Self-Attention(TSSA)机制,并将其集成到YOLOv11中。传统自注意力计算复杂度高,TSSA进行了范式转变,基于token统计特征实现高效注意力交互。它通过“算法展开”推导得出,以“最大编码率降低”为目标,实现特征学习。TSSA包含动态分组和低秩投影优化两步创新,具备线性复杂度。我们将TSSA代码集成到YOLOv11的C2PSA模块中。实验表明,改进后的YOLOv11在目标检测任务中表现良好,验证了TSSA机制的有效性。

魔改工程师的博客 669

排序算法--------交换排序(冒泡排序和快速排序)

排序算法------交换排序(冒泡排序和快速排序) 目录 排序算法------交换排序(冒泡排序和快速排序) 1、冒泡排序 2、快速排序 1、冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“...

烟雨gps 518

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2454

激光器安规详细解读 - 一级 - 并以940波长为例

前言: 作为人工智能的重要解决方案,激光作为不可或缺的一个选项。但是,激光的安规问题始终是要得到关注。尤其是3D识别技术在人脸上的使用的时候,如何判读激光器的安全使用规范,变得非常重要。本文,尝试从欧洲激光标准IEC 60825-1:2014,以及国家激光产品规则标准GB 7247.1,抛砖引玉,写出自己的理解。 本节,主要讨论,人脸识别需要符合的安全等级1: 1 激光标准的分类 激光国际...

山云的专栏 5036

冒泡排序的算法分析与改进(转载)

冒泡排序的算法分析与改进              交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。     应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。冒泡排序1、排序方法     将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描

zr1982930的专栏 1859

视觉Transformer实战 | Data-efficient image Transformer(DeiT)详解与实现

在计算机视觉领域,Vision Transformer (ViT) 已经证明了纯 Transformer 架构在图像分类任务上的强大能力。然而,ViT 通常需要在大规模数据集上预训练才能达到最佳性能,DeiT (Data-efficient image Transformer) 通过引入一系列训练策略和优化,使得 Transformer 模型能够在相对较小的数据集上取得优异表现。本节将详细介绍 DeiT 的技术原理,并使用 PyTorch 从零开始实现 DeiT 模型。

盼小辉丶的博客 1341

冒泡排序的算法分析与改进 (选择自 Uncommon 的 Blog )

冒泡排序的算法分析与改进              交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。     应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。冒泡排序1、排序方法     将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描

feng2112的专栏 1086

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

排序算法-冒泡排序算法分析与基于C/C++的编程实现(递归实现&非递归实现&改进的冒泡排序)

冒泡排序算法的排序过程 (以下排序过程按照大数位于小数右边的规则展开说明,按照大数位于小数左边的规则进行的冒泡排序与此过程类似) 首先进行第 1 次遍历,选取整个队列 (队列长度为 N) 的第 1 个数字 (记为 a),和紧邻 a 后的数字 (记为 b) 比较大小,如果 a 大于 b, 则交换 a 与 b 的位置,此后,a 继续和紧邻 a 后的数字 c 比较;如果 a 小于 b, 则丢下 a,...

考研数学课程、高等数学课程、线性代数课程、考研数一真题解析、考研数二真题解析、考研数三真题解析、考研数学讲义、考研数学资料、考研数学学习规划、考研数学辅导、考研数学习题、考研数学提分、荒原之梦考研数学 1815

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构与算法(Python版)三十三:冒泡排序和选择排序算法及分析

排序:冒泡排序Bubble Sort 冒泡排序的算法思路在于对无序表进行多趟比较交换, 每趟包括了多次两两相邻比较, 并将逆序的数据项互换位置, 最终能将本趟的最大项就位 经过n-1趟比较交换, 实现整表排序 每趟的过程类似于“气泡”在水中不断上浮到水面的经过 第1趟比较交换, 共有n-1对相邻数据进行比较 一旦经过最大项,则最大项会一路交换到达最后一项 第2趟比较交换时, 最大项已经就位, 需要排序的数据减少为n-1, 共有n-2对相邻数据进行比较 直到第n-1趟完成后, 最小项一定在列表首位, 就无需再

神薯片 3035

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

详解冒泡排序:经典与改进

冒泡排序最经典的代码实现和改进的代码实现

weixin_45907832的博客 183

35.数据结构与算法-交换排序-冒泡排序,快速排序

冒泡排序过程 冒泡排序算法 冒泡排序算法改进 冒泡排序算法分析 快速排序 快速排序演示 快速排序的算法 快速排序算法分析

q1312022158的博客 153
上一篇: java面试笔试题大汇总
下一篇: ORA-01461: can bind a LONG value only for insert into a LONG column
daniel112
博客等级 码龄21年 24粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值