1.算法的基本思想

冒泡排序是交换排序的一种,我们可以把将待排序的数组Arrray[0...n-1]理解成一个圆柱,将数组中的每一个元素都看成是重量为Array[i]的气泡,其中Array[0]在最上面 ,Array[n]在最下面。排序时候根据轻气泡在上重气泡在下的原则,自上而下扫描数组Array,遇到违反原则的气泡,就使其向下“下沉”,知道所有的气泡都是轻气泡在上重气泡在下,算法结束。

2.算法流程

1)初始时Array[0...n-1]无序,对n个元素序列进行n-1趟扫描。

2)第一趟扫描,自上而下比较数组R相邻的两个气泡的重量。若发现轻者在下、重在上,则交换两个气泡位置。

3)第二趟扫描,“次重”的气泡就被送到Array[n-2]的位置上。

4)按照如上方法进行扫描,每趟的扫描次数都比上次少一次。直到进行n-1趟扫描,算法结束。

3.算法实现

下面给出冒泡排序算法的实现代码

/*
函数功能:对无序序列进行基本的冒泡排序
函数参数:参数1,待排序的数组;参数2,待排序数组大小
*/
void BubbleSort(int *Array,int n)
{int temp,i,j;for(i=n-1;i<0;i++)for(j=0;j<i;j++)if(*(Array+j)>*(Array+j+1)){temp=*(Array+j);*(Array+j)=*(Array+j+1);*(Array+j+1)=temp;}
}
/*主程序*/
void main()
{int Array[8]={5,7,9,2,3,11,4};int i;printf("待排序数组为:\n");for(i=0;i<8;i++)pringf("%d ",*(Array+i));BubbleSort(Array,8);printf("\n冒泡排序后的数组为:\n");for(i=0;i<8;i++)printf("%d ",*(Array+i));
}

4.冒泡排序的改进算法

通过对简单冒牌排序算法的分析,我们不难得出这样一个结论:每一趟比较结束后,若发现从某一个位置r开始,不再记录交换,就说明从Array[r+1]到Array[n-1]已经排序好了,从而下一趟比较只要进行到位置r就可以了。若某一趟扫描中没有记录交换,则说明所有元素都已有序,算法可以结束了,而不是必须进行n-1趟扫描。基于这种思想,可以给出一种冒泡排序的改进算法。

冒泡排序改进算法1,主要是记录了最后一次发生交换发生的位置

/*
函数功能:对无序序列进行基本的冒泡排序
函数参数:参数1,待排序的数组;参数2,待排序数组大小
*/
#include<stdio.h>void BubbleSort(int* Array, int n)
{int bound = n;int i, m;int temp;while (bound != 0){for (i = 0;i < bound;i++){if (*(Array + i) > *(Array + i + 1)){temp = *(Array + i);*(Array + i) = *(Array + i + 1);*(Array + i + 1) = temp;m = i;/*用m来记录最后一次发生交换的位置*/}}bound = m;}
}
/*主程序*/
int main()
{int Array[8] = { 5,7,9,2,3,11,4 };int i;printf("待排序数组为:\n");for (i = 0;i < 8;i++)printf("%d ", *(Array + i));BubbleSort(Array, 8);printf("\n冒泡排序后的数组为:\n");for (i = 0;i < 8;i++){printf("%d ", *(Array + i));}
}

冒泡排序改进算法2(双向起泡),该算法中下沉和上浮是交替的。

/*
函数功能:对无序序列进行基本的冒泡排序
函数参数:参数1,待排序的数组;参数2,待排序数组大小
*/
#include<stdio.h>void BubbleSort(int* Array, int n)
{int boundmin = 0;int boundmax = n;int mmin,mmax,i;int temp;while (boundmin<boundmax){mmin = 0;mmax = 0;for (i = boundmin;i < boundmax;i++)/*此次扫描使重气泡下沉*/{if (*(Array + i) > *(Array + i + 1)){temp = *(Array + i);*(Array + i) = *(Array + i + 1);*(Array + i + 1) = temp;mmax = i;/*用mmax来记录下沉最后一次发生交换的位置*/}}if (mmax == 0)/*本次扫描没有记录交换,扫描结束*/break;boundmax = mmax;for (i = boundmax-1;i < boundmin;i--)/*此次扫描使轻气泡上浮*/{if (*(Array + i) <*(Array + i - 1)){temp = *(Array + i);*(Array + i) = *(Array + i - 1);*(Array + i -1) = temp;mmin= i;/*用mmin来记录上升最后一次发生交换的位置*/}}if (mmin == 0)/*本次扫描没有记录交换,扫描结束*/break;boundmin = mmin;}
}
/*主程序*/
int main()
{int Array[8] = { 5,7,9,2,3,11,4,8 };int i;printf("待排序数组为:\n");for (i = 0;i < 8;i++)printf("%d ", *(Array + i));BubbleSort(Array, 8);printf("\n冒泡排序后的数组为:\n");for (i = 0;i < 8;i++){printf("%d ", *(Array + i));}
}

5.性能评价

时间复杂度:最好为O(n),最坏为O(n2),因此平均时间复杂度为O(n2)。

空间复杂度:冒泡排序是就地排序,空间复杂度为O(1)。

稳定性:由算法流程知,冒牌排序是稳定的。

冒泡排序原理以及改进算法实现相关推荐

  1. 排序算法——冒泡排序原理动图详解及实现

    主要涉及的是内部排序  交换排序   => 冒泡排序   快速排序  选择排序   直接选择排序   堆排序  插入排序   直接插入排序   希尔排序  归并排序 冒泡排序 1. 简介 冒泡排 ...

  2. 十.激光SLAM框架学习之LeGO-LOAM框架---算法原理和改进、项目工程代码

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  3. 排序算法(一)——冒泡排序原理及Java实现

    冒泡排序原理:我觉得类似于拍集体照的时候老师指挥按大小个排队 依次比较两个相邻的数组元素.满足交换条件就交换二者位置,不满足就继续向下比较. 冒泡排序原理动态图(摘自网络) Demo代码 //冒泡排序 ...

  4. 标准粒子群算法(PSO)及其Matlab程序和常见改进算法

    一. 粒子群算法概述 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行 ...

  5. vb冒泡排序法流程图_VB算法-冒泡排序教案

    1 冒泡排序教学设计 班级:高一一班 授课教师:袁海军 一. 教案背景 模块:算法与程序设计 班级:高一( 1 )班 课时数: 1 课时 所用教材:华师大版<算法与程序设计> 教 师:袁海 ...

  6. 选择排序、插入排序、冒泡排序、希尔排序算法的总结 - 复杂度、实现和稳定性

    原文地址:https://www.jianshu.com/p/916b15eae350 常见排序算法的总结 - 复杂度.实现和稳定性 2018.08.29 16:20* 最基础的算法问题,温故知新.排 ...

  7. 人工智能学习笔记:基本遗传算法及其改进算法

    文章目录 1 引言 2 基本思想及发展历史 3 基本遗传算法详细步骤 3.1 编码 3.2 初始群体设定 3.3 设计适应度函数 3.4 遗传操作 3.4.1 选择 3.4.2 交叉 3.4.3 变异 ...

  8. nsl0重构算法 matlab,基于SL0压缩感知信号重建的改进算法

    第 28 卷 第 6 期 2012 年 6 月 信 号 处 理 SIGNAL PROCESSING Vol. 28 No. 6 Jun. 2012 收稿日期: 2012-03-30; 修回日期: 20 ...

  9. 计算机数学方法记录图像原理,图像处理原理技术与算法

    <图像处理原理技术与算法>是2001年浙江大学出版社出版的图书. 中文名 图像处理原理技术与算法 ISBN: 7308027775 条形码: 9787308027779 尺寸: 25.4 ...

最新文章

  1. Boost:BOOST_VERIFY扩展的用法测试程序
  2. OpenCV逻辑回归Logistic Regression的实例(附完整代码)
  3. ubuntu16.04安装pycharm
  4. ps图片如何实现渐变
  5. .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)
  6. 每天一道剑指offer-链表中第k个节点
  7. 无线网络常用软件与工具大全
  8. linux的vi2编辑相关命令,Linux vi/vim编辑器常用命令与用法总结
  9. 量化投资与python语言_在量化投资领域,为什么Python如此受欢迎?
  10. 远程登陆服务器跑深度学习程序
  11. 1118:铺地毯(C C++)
  12. 大桥数据,国外大桥排行榜数据清单,Python爬虫120例第32例
  13. Linux下通过NetLink获取网口信息
  14. 【后端教程】京东API网关实践之路!
  15. 软件工程——Alpha(2/3)
  16. linux系统(ubuntu)下安装exe文件
  17. python进阶豆瓣青梅竹_python3 Django+MySQL
  18. Android 花里胡哨的加载Loading动画
  19. excel根据条件列转行_Excel列转行,80%的人不知道这个方法!
  20. 2019全球智博会开幕在即,百度无人车、腾讯多个产品将亮相 | 智博会...

热门文章

  1. 探索2020高考语文作文写作方向下的新型教育模式
  2. [golang] golang文件读写 os.OpenFile(fileName,os.O_APPEND|os.O_WRONLY,os.ModeAppend)
  3. 认识Buildroot
  4. opencv图片倾斜度检测(一)对图片进行检测
  5. Flink log4j配置
  6. ELK日志分析系统(一)之ELK原理
  7. Vite HMR原理解析
  8. 计算机网络-自顶向下-Web应用2(Cookie、Web缓存、条件GET详解)
  9. 推荐程序开发辅助软件(流程图软件+代码注释软件)
  10. Recover-Deleted-File