JavaScript冒泡算法原理与实现方法深入理解


Posted in Javascript onJune 04, 2020

本文实例讲述了JavaScript冒泡算法。分享给大家供大家参考,具体如下:

在面试中经常会遇到面试官问到冒泡算法。今天总结一下。

###概念

有一组数,依次比较两个相邻的数,如果他们的顺序(如从大到小或从小到大等)错误就把他们交换过来。

我们先假设这一组数是有顺序的,那么我们找出它的规则。

JavaScript冒泡算法原理与实现方法深入理解

我们按照从小到大的顺序依次交换长方形,得到以下的结果。

第一轮交换结果:CBAD     交换次数:3次
第二轮交换结果:BACD     交换次数:3次
第三轮交换结果:ABCD     交换次数:3次

结果:

1.比较轮数 n-1
2.每次比较次数 n-1

###简单的冒泡算法

<script>
var arr = [1,2,3,4];
var temp = null;
var m = null;
var n = null;
// 双重for循环
for(var i=0;i<arr.length-1;i++){
//指定交换论数和交换次数(内循环控制交换次数)
    for(var a=0;a<arr.length-1;a++){
        if(arr[a]<arr[a+1]){
        //判断是否符合标准
            temp = arr[a+1];
            arr[a+1] = arr[a];
            arr[a] = temp;
        }
        m++;
    }
    n++;
}
console.log(arr);
console.log(m);
console.log(n);
</script>

得到结果

[4,3,2,1]     排序后
9                      交换次数
3                          轮数

在上述的例子中,有重复交换的数据,我们再来分析下。

第一轮交换:
第一次: 2 1 3 4
第二次: 2 3 1 4
第三次: 2 3 4 1
第二轮交换:
第一次: 3 2 4 1
第二次: 3 4 2 1
第三次: 3 4 2 1
第三轮交换:
第一次: 4 3 2 1
第二次: 4 3 2 1
第三次: 4 3 2 1

总结:

每一轮都会比较出一个最大值或最小值,然后后一轮没有必要再比较了
所以每比较一轮,就少比较一次。在第二轮的时候,有一个数不参与交换。
在第三轮的时候,有两个数不参与交换。依次类推。

所以,对上述代码优化。

var arr = [1,2,3,4];
var temp = null;
var m = null;
var n = null;

// 双重for循环
for(var i=0;i<arr.length-1;i++){
    //指定交换论数和交换次数(内循环控制交换次数)
    for(var a=0;a<arr.length-1-i;a++){

        if(arr[a]<arr[a+1]){

    //判断是否符合标准
    temp = arr[a+1];
    arr[a+1] = arr[a];
    arr[a] = temp;
    }
    m++;
    }
    n++;
}
console.log(arr);
console.log(m);
console.log(n);

得到结果。

[4,3,2,1] 排序后
6 交换次数
3 轮数

再来个稍微复杂点的例子。

<script>
var arr = [66,22,23,39,77,25,88];
var temp = null;
var m = null;
var n = null;

// 双重for循环
for(var i=0;i<arr.length-1;i++){
//指定交换论数和交换次数(内循环控制交换次数)

    for(var a=0;a<arr.length-1;a++){

        if(arr[a]<arr[a+1]){

    //判断是否符合标准
    temp = arr[a+1];
    arr[a+1] = arr[a];
    arr[a] = temp;
    }
    m++;
    }

    n++;

}
console.log(arr);
console.log(m);
console.log(n);
</script>

结果:

[88, 77, 66, 39, 25, 23, 22]
21 少交换了15次
6

结果其实已经提前完成,有重复交换次数。这次,我们加个判断,就是比较本次没有移动任何元素,那么说明已经完成结果。

<script>
var arr = [66,22,23,39,77,25,88,11,33,23];
var temp = null;
var m = null;
var n = null;
var flag = true;

// 双重for循环
for(var i=0;i<arr.length-1;i++){
//指定交换论数和交换次数(内循环控制交换次数)

    flag = true;

    for(var a=0;a<arr.length-1-i;a++){

        if(arr[a]<arr[a+1]){

    //判断是否符合标准
    temp = arr[a+1];
    arr[a+1] = arr[a];
    arr[a] = temp;
    flag = false;
    }
    m++;
    }

    n++;
    if(flag){
        break;
        }
    }

console.log(arr);
console.log(m);
console.log(n);
</script>

结果:

[88, 77, 66, 39, 33, 25, 23, 23, 22, 11]
42 少交换了 39次
7 少交换了2 轮

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
用htc组件制作windows选项卡
Jan 13 Javascript
仿新浪微博登陆邮箱提示效果的js代码
Aug 02 Javascript
Javascript封装DOMContentLoaded事件实例
Jun 12 Javascript
AspNet中使用JQuery boxy插件的确认框
May 20 Javascript
JavaScript function函数种类详解
Feb 22 Javascript
Web Uploader文件上传插件使用详解
May 10 Javascript
jquery与ajax获取特殊字符实例详解
Jan 08 Javascript
js中DOM事件绑定分析
Mar 18 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
Apr 16 Javascript
express启用https使用小记
May 21 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
Nov 12 Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 #Javascript
JQuery实现折叠式菜单的详细代码
Jun 03 #jQuery
JavaScript字符和ASCII实现互相转换
Jun 03 #Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
Jun 03 #Javascript
JavaScript监听键盘事件代码实现
Jun 03 #Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 #Javascript
深入分析jQuery.one() 函数
Jun 03 #jQuery
You might like
php中函数的形参与实参的问题说明
2010/09/01 PHP
yii操作cookie实例简介
2014/07/09 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
php实现数字补零的方法总结
2018/09/12 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
JQuery 写的个性导航菜单
2009/12/24 Javascript
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
javascript打印输出json实例
2013/11/11 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
django实现同一个ip十分钟内只能注册一次的实例
2017/11/03 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
奥地利智能家居和智能生活网上商店:tink.at
2019/10/07 全球购物
大一新生期末自我评价
2014/09/12 职场文书
小学中队委竞选稿
2015/11/20 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python