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 相关文章推荐
JavaScript 获取事件对象的注意点
Jul 29 Javascript
深入理解Javascript闭包 新手版
Dec 28 Javascript
js比较和逻辑运算符的介绍
Mar 10 Javascript
自己编写的类似JS的trim方法
Oct 09 Javascript
jQuery中:contains选择器用法实例
Dec 30 Javascript
微信企业号开发之微信考勤百度地图定位
Sep 11 Javascript
javascript实现图片轮播效果
Jan 20 Javascript
js css+html实现简单的日历
Jul 14 Javascript
关于Javascript回调函数的一个妙用
Aug 29 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
Jan 27 Javascript
Vue实现类似Spring官网图片滑动效果方法
Mar 01 Javascript
微信小程序弹窗禁止页面滚动的实现代码
Dec 30 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实现的封装验证码类详解
2013/06/18 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
老生常谈javascript的面向对象思想
2017/08/22 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
python urllib爬取百度云连接的实例代码
2017/06/19 Python
Django model反向关联名称的方法
2018/12/15 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
Python实现井字棋小游戏
2020/03/09 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
老师自我鉴定范文
2013/12/25 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
文明单位汇报材料
2014/12/24 职场文书
文艺节目主持词
2015/07/06 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python