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 相关文章推荐
读jQuery之十二 删除事件核心方法
Jul 31 Javascript
表单元素的submit()方法和onsubmit事件应用概述
Feb 01 Javascript
jQuery动画animate方法使用介绍
May 06 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
Feb 07 Javascript
javascript中加号(+)操作符的一些神奇作用
Jun 06 Javascript
基于JQuery制作可编辑的表格特效
Dec 23 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
Aug 19 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
Sep 01 Javascript
基于jQuery实现顶部导航栏功能
Dec 27 Javascript
详谈js中数组(array)和对象(object)的区别
Feb 27 Javascript
vue+axios 拦截器实现统一token的案例
Sep 11 Javascript
Vue实现购物小球抛物线的方法实例
Nov 22 Vue.js
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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
javascript关于继承解析
2016/05/10 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
python中zip和unzip数据的方法
2015/05/27 Python
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
采购文员岗位职责
2013/11/20 职场文书
个人现实表现材料
2014/02/04 职场文书
计算机专业职业规划
2014/02/28 职场文书
珍惜资源的建议书
2014/08/26 职场文书
承诺书模板
2014/08/30 职场文书
药店采购员岗位职责
2014/09/30 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
国情备忘录观后感
2015/06/04 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
工程移交协议书
2016/03/24 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫