本文实例讲述了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.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
本文向大家介绍JavaScript事件冒泡机制原理实例解析,包括了JavaScript事件冒泡机制原理实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了JavaScript事件冒泡机制原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 DOM事件流(event flow )存在三个阶段:事件捕获阶段、处于目标阶段、事件冒
本文向大家介绍深入理解jQuery中的事件冒泡,包括了深入理解jQuery中的事件冒泡的使用技巧和注意事项,需要的朋友参考一下 1.什么是冒泡 eg: 当你单击‘内层span元素'时,即触发<span>元素的click事件时,会输出3条记录 即: 内层span元素被点击 外层div元素被点击 body元素被点击 这就是事件冒泡引起的。 2.事件冒泡引发的问题 01.事件对象 在程序中使用事件对
本文向大家介绍Javascript冒泡排序算法详解,包括了Javascript冒泡排序算法详解的使用技巧和注意事项,需要的朋友参考一下 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需
本文向大家介绍PHP冒泡算法详解(递归实现),包括了PHP冒泡算法详解(递归实现)的使用技巧和注意事项,需要的朋友参考一下 实现 结果: 问题: 在尝试这个实现的时候遇到了一个问题,还未解决。 在这里: 补充: 解答: 这个可能不太好记住, 所以在使用的时候一定要注意, 在上面的问题中我就是忽略了这个问题导致了$index无限传递0值使得递归锁死。
本文向大家介绍Java随机数算法原理与实现方法实例详解,包括了Java随机数算法原理与实现方法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java随机数算法。分享给大家供大家参考,具体如下: 软件实现的算法都是伪随机算法,随机种子一般是系统时间 在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如: ax≡b (mod n)的方程。此方程有解当且
本文向大家介绍JS XMLHttpRequest原理与使用方法深入详解,包括了JS XMLHttpRequest原理与使用方法深入详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS XMLHttpRequest原理与使用方法。分享给大家供大家参考,具体如下: 你真的会使用XMLHttpRequest吗? 看到标题时,有些同学可能会想:“我已经用xhr成功地发过很多个Ajax请求了,对