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 相关文章推荐
Three.js源码阅读笔记(物体是如何组织的)
Dec 27 Javascript
一个JS函数搞定网页标题(title)闪动效果
May 13 Javascript
jquery+ajax实现跨域请求的方法
Jan 20 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
Mar 25 Javascript
Bootstrap对话框使用实例讲解
Sep 24 Javascript
bootstrap datepicker限定可选时间范围实现方法
Sep 28 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
Feb 15 Javascript
简单实现jQuery弹幕效果
May 06 jQuery
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 Javascript
angularjs实现猜数字大小功能
May 20 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 Javascript
微信小程序转化为uni-app项目的方法示例
May 22 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脚本数据库功能详解(上)
2006/10/09 PHP
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
destoon公司主页模板风格的添加方法
2014/06/20 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
微信自定义分享php代码分析
2016/11/24 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
jquery ui resizable bug解决方法
2010/10/26 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
python中list常用操作实例详解
2015/06/03 Python
用Python下载一个网页保存为本地的HTML文件实例
2018/05/21 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
python实现IOU计算案例
2020/04/12 Python
浅谈css3中的渐进增强和优雅降级
2017/12/01 HTML / CSS
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
Gap工厂店:Gap Factory
2017/11/02 全球购物
后备干部考察材料
2014/02/12 职场文书
禁毒宣传标语
2014/06/19 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书