一、冒泡排序简介:
假设有一个数组a,我们想象成有一个班级名叫a班,现在全班随意排成一排,排头的位置是a[0],排尾的位置是a[a.length-1]。但高矮顺序不是有序的,我们想从矮到高排,排头最矮,排尾最高。
下面是一种方法:
第一轮:
1、首先,排头和旁边的队员比较,如果比旁边队员高,两个人交换位置;不比旁边队员高,则不变。经过这第一次比较,可以肯定站在a[1]位置的肯定是a[0]、a[1]位置队员中较高的那一位;
2、a[1]位置队员和a[2]位置队员比较,如果比a[2]位置队员高,两个人交换位置;不比a[2]位置队员高,则不变。经过这第二次比较,可以肯定站在a[2]位置的肯定是a[0]、a[1]、a[2]位置队员中最高的那一位;
3、a[2]位置队员和a[3]位置队员比较,如果比a[3]位置队员高,两个人交换位置;不比a[3]位置队员高,则不变。经过这第三次比较,可以肯定站在a[3]位置的肯定是a[0]、a[1]、a[2]、a[3]位置队员中最高的那一位;
······
直到a[a.length-2]位置队员和a[a.length-1]位置队员比较完成,这样的结果是,最高的那一位队员到了队尾的位置。
说明:
1、这有点像是“冒泡”的过程,称为冒泡排序还是比较形象的;就像老师说:“谁最高?排到队尾!”,但是眼睛看不准确,所以挨着挨着比较,第一轮之后最高的那个队员冒了出来,到了队尾的位置。
2、上面叙述中用了“不比某队员高”的叙述方法,而不是“比某队员矮”的叙述方法,采用后一种叙述将漏掉两者一样高的情况。当两者一样高时,不用换位置。
第二轮:
重复第一轮的过程,只不过,现在不用比较到最后一个位置,因为第一轮已经知道他是最高的,只需要比较到倒数第二个位置即可。
第三轮:
重复第一轮的过程,只不过,现在不用比较到倒数第二个位置,因为第二轮已经知道他是第二高的,只需要比较到倒数第三个位置即可。
·····
直到,只剩下排头的位置a[0]和旁边的位置a[1],这时a[2]位置已经是倒数第三高了,a[0]和a[1]再次比较,较高的排在a[1]位置,那么整个排序就已完成。
这种排序的思想就是冒泡排序。
二、用JavaScript实现冒泡排序
function sort(arr) {
var l=arr.length-1;
var temp;
while(l>0){
for (var j = 0; j < l; j++) {
if (arr[j]>arr[j+1]) {
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
l--;
}
return arr;
}
var a=[11,2,3,445,7,32,71,8,94];
console.log(sort(a));
var b=[94,11];
console.log(sort(b));
1、结束条件:
当l=1时,还有a[0]位置和a[1]位置没比较,还可以比较一次;当l=0时,全部都比较过了,因此不用再比较;
2、一个小陷阱:
如果用change函数代替交换过程,即调用用以下函数
function change(num1,num2){
var temp=num2;
num2=num1;
num1=temp;
}
代替如下部分:
if (arr[j]>arr[j+1]) {
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
```不能实现正确的逻辑,因为调用change函数时,将arr[j]和arr[j+1]的值赋值给num1和num2变量,然后交换num1和num2变量,并未实现交换arr[j]和arr[j+1]。