冒泡排序
- 冒泡排序由于比較簡(jiǎn)單和容易理解,往往會(huì)成為人們首先想到的排序算法。所謂冒泡就是泡泡一個(gè)一個(gè)往上冒,讓體積最輕的泡泡浮在最上面,然后按照重量往下依次排列。(讓當(dāng)前項(xiàng)和后一項(xiàng)進(jìn)行比較,如果當(dāng)前項(xiàng)大于后一項(xiàng),兩個(gè)交換位置,小的在前面)
比如
var ary = [4,3,5,2,1];
第一輪比較
4>3 交換位置 [3,4,5,2,1]
4<5 不交換位置 [3,4,5,2,1]
5>2 交換位置 [3,4,2,5,1]
5>1 交換位置 [3,4,2,1,5]
雖然沒有實(shí)現(xiàn)目標(biāo),但是已經(jīng)把最大的一項(xiàng)放在末尾
第二輪比較
3<4 不交換位置 [3,4,2,1,5]
4>2 交換位置 [3,2,4,1,5]
4>1 交換位置 [3,2,1,4,5]
到此結(jié)束本輪比較,因?yàn)樵诘谝惠喼幸呀?jīng)把最大的放在最后了,因此,下行就不需要了,但是為了驗(yàn)證,我再次寫出
4<5 不交換位置 [3,2,1,4,5]
雖然沒有實(shí)現(xiàn)目標(biāo),但是已經(jīng)把第二大的一項(xiàng)放在末尾
第三輪比較
3>2 交換位置 [2,3,1,4,5]
3>1 交換位置 [2,1,3,4,5]
到此結(jié)束本輪比較,因?yàn)樵诘诙喼幸呀?jīng)把第二最大的放在倒數(shù)第二了,因此,下行就不需要了,但是為了驗(yàn)證,我再次寫出
3<4 不交換位置 [2,1,3,4,5]
4<5 不交換位置 [2,1,3,4,5]
雖然沒有實(shí)現(xiàn)目標(biāo),但是已經(jīng)把第三大一項(xiàng)放在末尾
第四輪比較
2>1 交換位置 [1,2,3,4,5]
到此結(jié)束本輪比較,因?yàn)樵诘谌喼幸呀?jīng)把第三大的放在倒數(shù)第三了,因此,下一行就不需要了,但是為了驗(yàn)證,我再次寫出
2<3 不交換位置 [1,2,3,4,5]
3<4 不交換位置 [1,2,3,4,5]
4<5 不交換位置 [1,2,3,4,5]
已經(jīng)實(shí)現(xiàn)目標(biāo)
從以上例子可以看出,我們可以總結(jié)出規(guī)律
假如有n項(xiàng),我們用i代表數(shù)組的索引,i從0開始。
我們最多最多比較n-1輪,把最大值放在最后,把第二大放在倒數(shù)第二。。。。。。每一輪比較的次數(shù):n-1-i;按照此規(guī)律即可實(shí)現(xiàn)數(shù)組排序
規(guī)律已經(jīng)總結(jié)出,但是我們發(fā)現(xiàn)在比較中,要比較的兩項(xiàng)交換位置,那么怎樣才能交換位置呢?
var a= 1;
var b=2;
var c= null;
c=a;
a=b;
b=c;
console.log(a,b,c);
結(jié)果為2,1,1 我們可以看到a=2,b=1 a和b已經(jīng)交換位置了
第二種方法,不用第三方變量來交換位置
var a= 1;
var b=2;
a = a+b;
b = a-b;
a = a-b;
console.log(a,b)
結(jié)果為 2,1 a和b已經(jīng)交換位置
*寫到這里思想已經(jīng)分析完了,下面就是上代碼了
var ary = [4,3,5,2,1];
var tmp = null;
function bubbleSort(ary) {
for(var i=0;i<ary.length-1;i++){//此處是控制比較輪數(shù),此數(shù)組長度為5,比較四次,也就是i<(5-1);i依次是0,1,2,3 比較4次
for(var j=0;j<ary.length-1-i;j++){//此處控制每輪比較的次數(shù)
if(ary[j]>ary[j+1]){
tmp = ary[j];
ary[j] = ary[j+1];
ary[j+1] = tmp;
}
}
}
return ary;
}
var res = bubbleSort(ary);
console.log(res);
結(jié)果為 [1, 2, 3, 4, 5]