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遍历input取得input的name
Apr 27 Javascript
基于jQuery的投票系统显示结果插件
Aug 12 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
Aug 27 Javascript
Bootstrap每天必学之折叠
Apr 12 Javascript
js生成随机数(指定范围)的实例代码
Jul 10 Javascript
js 动态给元素添加、移除事件的实现方法
Jul 19 Javascript
浅述Javascript的外部对象
Dec 07 Javascript
javascript设计模式之策略模式学习笔记
Feb 15 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
Oct 12 Javascript
js实现内置计时器
Dec 16 Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 Javascript
四十九个javascript小知识实用技巧
Nov 20 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 curl模拟post请求小实例
2013/11/13 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
Python 多线程抓取图片效率对比
2016/02/27 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
Python bisect模块原理及常见实例
2020/06/17 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
UML设计模式笔试题
2014/06/07 面试题
跟单文员岗位职责
2014/01/03 职场文书
小学副班长竞选稿
2015/11/21 职场文书
Java spring定时任务详解
2021/10/05 Java/Android