排序算法之冒泡(一)

来源:互联网 发布:windows dns配置文件 编辑:程序博客网 时间:2024/06/07 10:11

对 [2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]排序,研究一下

  • 普通算法
var count = 0;var exchange = 0;for(var i = 0; i < a.length; i++){    for(var j = i + 1; j < a.length; j++){        if(a[i] > a[j]){            var temp = a[i];            a[i] = a[j];            a[j] = temp;            exchange++;        }        console.log("第", ++count,"次",a);    }}console.log("总共交换了: ", exchange, "次");
  • 结果如下:
1 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]第 2 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]第 3 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]第 4 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]第 5 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]第 6 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 7 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 8 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 9 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 10 次 [ 1, 6, 7, 8, 3, 10, 2, 5, 9, 4 ]第 11 次 [ 1, 6, 7, 8, 3, 10, 2, 5, 9, 4 ]第 12 次 [ 1, 3, 7, 8, 6, 10, 2, 5, 9, 4 ]第 13 次 [ 1, 3, 7, 8, 6, 10, 2, 5, 9, 4 ]第 14 次 [ 1, 2, 7, 8, 6, 10, 3, 5, 9, 4 ]第 15 次 [ 1, 2, 7, 8, 6, 10, 3, 5, 9, 4 ]第 16 次 [ 1, 2, 7, 8, 6, 10, 3, 5, 9, 4 ]第 17 次 [ 1, 2, 7, 8, 6, 10, 3, 5, 9, 4 ]... ...44 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 10, 9 ]第 45 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]总共交换了:  21

缺点:把小的数“容易”放到了后面,参考第6次和第14次。交换次数过多。

  • 普通算法-优化版:
var count = 0;var exchange = 0;for(var i = 0; i < a.length; i++){    for(var j = a.length-1; j > i; j--){        if(a[i] > a[j]){            var temp = a[i];            a[i] = a[j];            a[j] = temp;            exchange++;        }        console.log("第", ++count,"次",a);    }}console.log("总共交换了: ", exchange, "次");
  • 结果:
1 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]第 2 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]第 3 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 9, 4 ]第 4 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 5 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 6 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 7 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 8 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 9 次 [ 1, 7, 6, 8, 3, 10, 2, 5, 9, 4 ]第 10 次 [ 1, 4, 6, 8, 3, 10, 2, 5, 9, 7 ]第 11 次 [ 1, 4, 6, 8, 3, 10, 2, 5, 9, 7 ]第 12 次 [ 1, 4, 6, 8, 3, 10, 2, 5, 9, 7 ]第 13 次 [ 1, 2, 6, 8, 3, 10, 4, 5, 9, 7 ]第 14 次 [ 1, 2, 6, 8, 3, 10, 4, 5, 9, 7 ]第 15 次 [ 1, 2, 6, 8, 3, 10, 4, 5, 9, 7 ]第 16 次 [ 1, 2, 6, 8, 3, 10, 4, 5, 9, 7 ]第 17 次 [ 1, 2, 6, 8, 3, 10, 4, 5, 9, 7 ]... ...44 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]第 45 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]总共交换了:  13

缺点:已无法优化,虽然交换次数少了,但是循环次数永远这么多

  • 冒泡算法:
  • 算法思想:两个两个比较,顺序上移。
var count = 0;var exchange = 0;for(var i = 0; i < a.length; i++){    for(var j = a.length-1; j > i; j--){        if(a[j] < a[j-1]){            var temp = a[j];            a[j] = a[j-1];            a[j-1] = temp;            exchange++;        }        console.log("第", ++count,"次",a, i, j);    }}console.log("总共交换了: ", exchange, "次");
  • 结果:
第 1 次 [ 2, 7, 6, 8, 3, 10, 1, 5, 4, 9 ] 0 9第 2 次 [ 2, 7, 6, 8, 3, 10, 1, 4, 5, 9 ] 0 8第 3 次 [ 2, 7, 6, 8, 3, 10, 1, 4, 5, 9 ] 0 7第 4 次 [ 2, 7, 6, 8, 3, 1, 10, 4, 5, 9 ] 0 6第 5 次 [ 2, 7, 6, 8, 1, 3, 10, 4, 5, 9 ] 0 5第 6 次 [ 2, 7, 6, 1, 8, 3, 10, 4, 5, 9 ] 0 4第 7 次 [ 2, 7, 1, 6, 8, 3, 10, 4, 5, 9 ] 0 3第 8 次 [ 2, 1, 7, 6, 8, 3, 10, 4, 5, 9 ] 0 2第 9 次 [ 1, 2, 7, 6, 8, 3, 10, 4, 5, 9 ] 0 1第 10 次 [ 1, 2, 7, 6, 8, 3, 10, 4, 5, 9 ] 1 9第 11 次 [ 1, 2, 7, 6, 8, 3, 10, 4, 5, 9 ] 1 8第 12 次 [ 1, 2, 7, 6, 8, 3, 4, 10, 5, 9 ] 1 7第 13 次 [ 1, 2, 7, 6, 8, 3, 4, 10, 5, 9 ] 1 6第 14 次 [ 1, 2, 7, 6, 3, 8, 4, 10, 5, 9 ] 1 5第 15 次 [ 1, 2, 7, 3, 6, 8, 4, 10, 5, 9 ] 1 4第 16 次 [ 1, 2, 3, 7, 6, 8, 4, 10, 5, 9 ] 1 3第 17 次 [ 1, 2, 3, 7, 6, 8, 4, 10, 5, 9 ] 1 2... ...第 31 次 [ 1, 2, 3, 4, 5, 7, 6, 8, 9, 10 ] 4 9第 32 次 [ 1, 2, 3, 4, 5, 7, 6, 8, 9, 10 ] 4 8第 33 次 [ 1, 2, 3, 4, 5, 7, 6, 8, 9, 10 ] 4 7第 34 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 4 6第 35 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 4 5第 36 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 5 9第 37 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 5 8第 38 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 5 7第 39 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 5 6第 40 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 6 9第 41 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 6 8第 42 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 6 7第 43 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 7 9第 44 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 7 8第 45 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 8 9总共交换了:  20 次
  • ps: 交换次数这么多,且循环次数也没减少,要你何用!
  • 从 i = 5这一轮开始,就没有了交换,这个地方可以优化一下
  • 代码:
var count = 0;var exchange = 0;var flag = true;for(var i = 0; i < a.length  && flag; i++){    flag = false;    for(var j = a.length-1; j > i; j--){        if(a[j] < a[j-1]){            var temp = a[j];            a[j] = a[j-1];            a[j-1] = temp;            flag = true;            exchange++;        }        console.log("第", ++count,"次",a, i, j);    }}console.log("总共交换了: ", exchange, "次");`
  • 结果
... ...37 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 5 838 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 5 739 次 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 5 6总共交换了:  20