冒泡排序的思想
*将前一个元素与后一个元素先比较,如果前一个元素大,那么将此元素与后一个元素调换位置,然后依次比较,直到比较出最大的一位放在最后,之后依次类推即可。*
一、冒泡排序的图示表达
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]
// 结果并没有发生改变,猜想成功!