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 相关文章推荐
CSDN轮换广告图片轮换效果
Mar 27 Javascript
JQuery的AJAX实现文件下载的小例子
May 15 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
在Html中使用Requirejs进行模块化开发实例详解
Apr 15 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
Aug 05 Javascript
jQuery元素选择器实例代码
Feb 06 Javascript
php register_shutdown_function函数详解
Jul 23 Javascript
Node.js实现简单的爬取的示例代码
Jun 25 Javascript
layui radio点击事件实现input显示和隐藏的例子
Sep 02 Javascript
layui上传图片到服务器的非项目目录下的方法
Sep 26 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
Nov 01 Javascript
OpenLayers实现图层切换控件
Sep 25 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遍历文件夹与子目录的函数代码
2011/09/26 PHP
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
js之onload事件的一点使用心得
2013/08/14 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
Python实现队列的方法
2015/05/26 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
使用Python对Excel进行读写操作
2017/03/30 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
Jupyter加载文件的实现方法
2020/04/14 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
佳能法国商店:Canon法国
2019/02/14 全球购物
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
商务日语毕业生自荐信范文
2013/11/14 职场文书
客房主管岗位职责
2013/12/09 职场文书
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
会计岗位描述
2014/02/22 职场文书
红与黑读书笔记
2015/06/29 职场文书
环保宣传语大全
2015/07/13 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS