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 showModalDialog 多层模态窗口实现页面提交及刷新的代码
Nov 28 Javascript
JS小功能(button选择颜色)简单实例
Nov 29 Javascript
基于jQuery实现网页进度显示插件
Mar 04 Javascript
jquery获取css的color值返回RGB的方法
Dec 18 Javascript
浅谈JS函数定义方式的区别
Oct 30 Javascript
原生js实现放大镜效果
Jan 11 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
Jan 13 Javascript
js实现上下左右弹框划出效果
Mar 08 Javascript
纯原生js实现贪吃蛇游戏
Apr 16 Javascript
微信小程序本地缓存数据增删改查实例详解
May 24 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
Sep 19 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
咖啡常见的种类
2021/03/03 新手入门
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
php实现两个数组相加的方法
2015/02/17 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
PHP代码加密的方法总结
2020/03/13 PHP
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python的Flask开发框架简单上手笔记
2015/11/16 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
python实现事件驱动
2018/11/21 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
优秀管理者事迹材料
2014/05/22 职场文书
毕业生见习报告总结
2014/11/08 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
士兵突击观后感
2015/06/16 职场文书