JavaScript冒泡算法原理与实现方法深入理解
文实例讲述了JavaScript冒泡算法。分享给大家供大家参考,具体如下: 在面试中经常会遇到面试官问到冒泡算…
文实例讲述了JavaScript冒泡算法。分享给大家供大家参考,具体如下:
在面试中经常会遇到面试官问到冒泡算法。今天总结一下。
有一组数,依次比较两个相邻的数,如果他们的顺序(如从大到小或从小到大等)错误就把他们交换过来。
我们先假设这一组数是有顺序的,那么我们找出它的规则。
1
我们按照从小到大的顺序依次交换长方形,得到以下的结果。
第一轮交换结果: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 轮 |
本文收集自互联网,转载请注明来源。
如有侵权,请联系 wper_net@163.com 删除。
还没有任何评论,赶紧来占个楼吧!