浅谈冒泡排序


冒泡排序的思想

    *将前一个元素与后一个元素先比较,如果前一个元素大,那么将此元素与后一个元素调换位置,然后依次比较,直到比较出最大的一位放在最后,之后依次类推即可。*

一、冒泡排序的图示表达


var mP=[9,5,10,4,3];
// 将第一位一次与后一位比较,将最大的放在最后面
9,5,10,4,3
5,9,10,4,3
5,9,10,4,3  //第一轮比较了4次出结果
5,9,4,10,3
5,9,4,3,10

5,9,4,3,10
5,9,4,3,10
5,4,9,3,10  //第二轮比较了3次出结果
5,4,3,9,10
5,4,3,9,10


5,4,3,9,10
4,5,3,9,10  //第三轮比较了2次出结果
4,3,5,9,10
4,3,5,9,10
4,3,5,9,10

4,3,5,9,10
3,4,5,9,10
3,4,5,9,10  //第四轮比较了1次出结果
3,4,5,9,10
3,4,5,9,10

二、实际验证猜想

注意:后面的排序中将会使用酱油瓶原理(懂得忽略)

var a=10;
var b=20;
var change=a;
a=b;
b=change;
console.log(a,b) //20 10   a 和 b 值已经交换


var mP=[9,5,10,4,3];
// 第一轮较
for(var i=0;i<mP.length;i++){
    // console.log(mP[i])  //9,5,10,4,3
    //先拿到数组中的每一个元素
    if(mP[i]>mP[i+1]){
        //如果前面的大于后面的就交换
        var change=mP[i];
            mP[i]=mP[i+1];
            mP[i+1]=change 
    	}
  }
console.log(mP)  //[5, 9, 4, 3, 10]
// 由此可见最大的已经到后面了


// 第二轮比较
for(var i=0;i<mP.length;i++){
    // console.log(mP[i])  //9,5,10,4,3
    //先拿到数组中的每一个元素
    if(mP[i]>mP[i+1]){
        //如果前面的大于后面的就交换
        var change=mP[i];
            mP[i]=mP[i+1];
            mP[i+1]=change 
    }
}
console.log(mP)  //[5, 4, 3, 9, 10]

// 第三轮比较
for(var i=0;i<mP.length;i++){
    // console.log(mP[i])  //9,5,10,4,3
    //先拿到数组中的每一个元素
    if(mP[i]>mP[i+1]){
        //如果前面的大于后面的就交换
        var change=mP[i];
            mP[i]=mP[i+1];
            mP[i+1]=change 
    }
}
console.log(mP)  //[4, 3, 5, 9, 10]


// 第四轮比较
for(var i=0;i<mP.length;i++){
    // console.log(mP[i])  //9,5,10,4,3
    //先拿到数组中的每一个元素
    if(mP[i]>mP[i+1]){
        //如果前面的大于后面的就交换
        var change=mP[i];
            mP[i]=mP[i+1];
            mP[i+1]=change 
    }
}
console.log(mP) //[3, 4, 5, 9, 10]

// 第五轮比较
for(var i=0;i<mP.length;i++){
    // console.log(mP[i])  //9,5,10,4,3
    //先拿到数组中的每一个元素
    if(mP[i]>mP[i+1]){
        //如果前面的大于后面的就交换
        var change=mP[i];
            mP[i]=mP[i+1];
            mP[i+1]=change 
    }
}
console.log(mP)   //[3, 4, 5, 9, 10]

三、进一步猜想

通过五次比较,数组已经完成了排序,但是我们发现几次比较下来,只要4轮对比最多比较4次就可以得出结果而且代码却没有改变。
由此我们猜想是否可以将五轮比较放入一个循环中?

// 
for(var j=0;j<mP.length-1;j++){
    for(var i=0;i<mP.length-1;i++){
    // console.log(mP[i])  //9,5,10,4,3
    //先拿到数组中的每一个元素
        if(mP[i]>mP[i+1]){
            //如果前面的大于后面的就交换
            var change=mP[i];
                mP[i]=mP[i+1];
                mP[i+1]=change
    
        }

    }

}
console.log(mP)    //[3, 4, 5, 9, 10]
// 通过尝试验证了我们的猜想 ^_^^_^

四、最终猜想de~

进一部猜想,通过比较图示的比较次数,每轮的比较次数都是在减少的?
猜想:是否可以在每轮循环中让比较次数一次减少呢?
我们发现mP的长度是固定的5,j在每轮增加1
mP j
第一轮 4 0
第二轮 4 1
第三轮 4 2
第四轮 4 3
第五轮 4 4
那么我们尝试让mP的长度一次递减。

五、最后验证

for(var j=0;j<mP.length-1;j++){
    for(var i=0;i<mP.length-1-j;i++){   
        if(mP[i]>mP[i+1]){
            var change=mP[i];
                mP[i]=mP[i+1];
                mP[i+1]=change
    
        }

    }

}
console.log(mP) //[3, 4, 5, 9, 10]
// 结果并没有发生改变,猜想成功!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的瓜牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值