它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

1.冒泡算法-简单传统效率最低

  • <1>.比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • <2>.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • <3>.针对所有的元素重复以上的步骤,除了最后一个;
  • <4>.重复步骤1~3,直到排序完成。
  • 例如:以下是按顺序排序,改变符号即倒序排序

php

function bubbleSort($arr){for ($i=0;$i<count($arr);$i++){for ($j=0;$j<count($arr)-1-$i;$j++){if ($arr[$j]>$arr[$j+1]){$temp = $arr[$j+1];$arr[$j+1] = $arr[$j];$arr[$j] = $temp;}}}return $arr;}$arr = array(7,3,9,6,44,22,44,11,33,4);
$arr = bubbleSort($arr);
var_dump($arr);

JavaScript

function bubbleSort(arr) {var len = arr.length;for (var i = 0; i < len; i++) {for (var j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j+1]) {        //相邻元素两两对比var temp = arr[j+1];        //元素交换arr[j+1] = arr[j];arr[j] = temp;}}}return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

2.冒泡算法-改进-定位效率高

设置一标志性变量$pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

php

function bubbleSort2($arr) {$i = count($arr)-1;  //初始时,最后位置保持不变while ( $i> 0) {$pos= 0; //每趟开始时,无记录交换for ($j= 0; $j< $i; $j++)if ($arr[$j]> $arr[$j+1]) {$pos= $j; //记录交换的位置$tmp = $arr[$j]; $arr[$j]=$arr[$j+1];$arr[$j+1]=$tmp;}$i= $pos; //为下一趟排序作准备}return $arr;
}

js

function bubbleSort2(arr) {console.time('改进后冒泡排序耗时');var i = arr.length-1;  //初始时,最后位置保持不变while ( i> 0) {var pos= 0; //每趟开始时,无记录交换for (var j= 0; j< i; j++)if (arr[j]> arr[j+1]) {pos= j; //记录交换的位置var tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;}i= pos; //为下一趟排序作准备}console.timeEnd('改进后冒泡排序耗时');return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort2(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

3.冒泡算法-改进-前后一起提高效率

传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。

php

function bubbleSort3($arr){$low = 0;$high = count($arr) - 1; //设置变量的初始值while ($low < $high) {for ($j = $low; $j < $high; ++$j) //正向冒泡,找到最大者if ($arr[$j] > $arr[$j + 1]) {$tmp = $arr[$j];$arr[$j] = $arr[$j + 1];$arr[$j + 1] = $tmp;}--$high;                 //修改high值, 前移一位for ($j = $high; $j > $low; --$j) //反向冒泡,找到最小者if ($arr[$j] > $arr[$j + 1]) {$tmp = $arr[$j];$arr[$j] = $arr[$j + 1];$arr[$j + 1] = $tmp;}}return $arr;
}

js

function bubbleSort3(arr3) {var low = 0;var high= arr.length-1; //设置变量的初始值var tmp,j;console.time('2.改进后冒泡排序耗时');while (low < high) {for (j= low; j< high; ++j) //正向冒泡,找到最大者if (arr[j]> arr[j+1]) {tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;}--high;                 //修改high值, 前移一位for (j=high; j>low; --j) //反向冒泡,找到最小者if (arr[j] arr[j+1]) {tmp = arr[j]; arr[j]=arr[j+1];arr[j+1]=tmp;}}
}

若本文对大家了解算法有所帮助,点个赞或打个赏吧~谢谢您嘞~~

常见十大算法 冒泡算法相关推荐

  1. 冒泡和快速排序的时间复杂度_十大经典排序算法——快速排序

    目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a ...

  2. 十大经典排序算法1(Python版本)

    文章目录 一.排序算法与时间复杂度 二.冒泡排序 一.排序算法与时间复杂度 1.十大排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次 ...

  3. 数据结构十大经典排序算法--Python

    十大经典排序算法 (java实现看这个)https://program.blog.csdn.net/article/details/83785159 名词解释: 1.冒泡排序 2.选择排序 3.插入排 ...

  4. 十大经典排序算法及比较与分析 ( 动画演示 ) ( 可视化工具 )

    可视化工具及动画展示:旧金山大学 (usfca)|数据结构可视化工具 排序算法概念及描述:1.0 十大经典排序算法(文章部分内容引用自改文章) 参考:邓俊辉 的数据结构 本文未对排序算法概念进行详细说 ...

  5. 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解

    概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...

  6. 算法 - 十大经典排序算法(动图演示)

    [TOC] 算法 - 十大经典排序算法(动图演示) ​ 在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法.最常用到的排 ...

  7. 一文搞定十大经典排序算法

    更多内容关注公众号:SAP Technical 一.排序算法概述 1.定义 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序. 2.分类 十种常见排序算法可以分为两大类: 非线性时间 ...

  8. 十大经典排序算法动画与解析,看我就够了

    作者 | 程序员小吴 转载自五分钟学算法(ID: CXYxiaowu) 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行 ...

  9. 十大经典排序算法(建议收藏)

    来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述  0.1 算法分类 十种 ...

  10. 11月14日云栖精选夜读 | 动画+原理+代码,解读十大经典排序算法

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过 ...

最新文章

  1. 洛谷P1032 字串变换
  2. 50多种适合机器学习和预测应用的API,你的选择是?(2018年版本)
  3. ES查看segment大小
  4. pyqt 获取 UI 中组件_初级UI需注意10个移动端的关键原则
  5. css3 上线圆角效果
  6. cocos2d-x游戏开发(一)开始菜单
  7. 不是keys,记一次因 redis 使用不当导致应用卡死 的过程
  8. 若川的2016年度总结,毕业工作
  9. python安全性_关于python安全性的问题
  10. python爬取付费音乐包_python爬虫如何下载QQ音乐付费歌曲2020最新版
  11. c语言国二题库选择填空题,国二c语言笔试题库(含答案),选择填空.doc
  12. 「程序猿 DD」星球活动第一期正式开启!
  13. 概念学习(Concept learning)
  14. ValueError: operands could not be broadcast together with shapes (100,) (71,)
  15. MT6739充电IC集成步骤
  16. 线性波传播至垂直壁面反射形成驻波的动画MATLAB程序
  17. (1/2) sharex录制屏幕没有声音,升级高版本的sharex
  18. 移植vsftpd FTP服务器到ARM-Linux系统
  19. (转)任正非对新员工的寄语:烧不死的就是凤凰
  20. 微信小程序实现页面强制刷新

热门文章

  1. 从300行文件系统的实现内窥Linux VFS组织
  2. iMazing 2.11.7 WinMac 中文版 — iOS设备管理工具
  3. android恢复删除文件,如何恢复手机删除的文件
  4. MATLAB与高等数学--dsolve命令
  5. Android中英文切换
  6. 域名和IP地址是一回事吗?建网站要买域名还要买IP地址吗?
  7. 15b万用表怎么测电容_万用表怎么用?福禄克15B+一机详解万用表的使用方法
  8. 阵列卡的全称叫磁盘阵列卡 是用来做 RAID
  9. Hello Qt(十六)——QT绘图实例-钟表
  10. Android 分享到新浪微博