1冒泡算法一直以來是排序算法裏面一個無法避開的算法,那麼是否可以對其進行優化呢?本文基於作者的亂七八糟的想法對冒泡算法是否能夠優化進行探究。
2首先介紹一下冒泡算法的標準寫法
arr=[2,51,159,45,42,126,144,123,159,1444,1587];
//一個無序數組
var len = arr.length;
//把長度拿出來避免多次查找;
for(var i = 0;i < len;i++){
for (var j = 0;j < len;j++){
if(arr[j]<arr[j+1]){
//來個中間量,起到儲存的作用;
var mid;
mid = arr[j];arr[j]=arr[j+1];arr[j+1]=mid;
}
}
}
console.log(arr);
現在由於最後一位不需要重複比較,我們把len減少1
arr=[2,51,159,45,42,126,144,123,159,1444,1587];
//一個無序數組
var len = arr.length-1;
//len減1,代碼執行結果並不會有什麼變化;
//把長度拿出來避免多次查找;
for(var i = 0;i < len;i++){
for (var j = 0;j < len;j++){
if(arr[j]<arr[j+1]){
//來個中間量,起到儲存的作用;
var mid;
mid = arr[j];arr[j]=arr[j+1];arr[j+1]=mid;
}
}
}
console.log(arr);
3 介紹一個js裏面的時間戳的辦法Date()對象 有興趣可以自己去看
var firstTime = new Date();
var sun = 0;
for(var i = 0;i < 1000000000;i++);
sun += i;
var lastTime = new Date();
console.log(lastTime-firstTime);
通過此方法可以測試程序的執行時間;以便進行時間效率的對比;
4 產生一個長度非常長的隨機數組,這樣可以更好的測試程序,避免誤差;這裏只寫到了10,原因這段代碼只是爲了測試,所以不需要太長的數組,在時間測試的時候記得去掉brr的打印,然後加上時間打印;
//隨機產生一個1-10000之間的整數
function radom(){return parseInt(Math.random()*10000); };
var brr = [];
for(var a = 0;a < 10;a++) {
brr.push(radom());
};
console.log(brr);
5重點來了,關於爲什麼優化冒泡算法的起因,我們都知道,冒泡算法是把一個最大或者最小的數字(或者某些手寫的功能)冒泡到最後一位的方法,那麼我們可以保證最後一位一定已經確定了的,那麼爲什麼我們的程序在j循環的時候不能把去掉最後的一位的比較呢?基於這一想法,我對冒泡算法進行了一定的優化
var firstTime = new Date();
function radom(){return parseInt(Math.random()*10000); };
var arr = [];
for(var a = 0;a < 20000;a++) {
arr.push(radom());
};
var len = arr.length-1;
//把長度拿出來避免多次查找;
for(var i = 0;i < len;i++){
for (var j = 0;j < len;j++){
if(arr[j]<arr[j+1]){
//來個中間量,起到儲存的作用;
var mid;
mid = arr[j];arr[j]=arr[j+1];arr[j+1]=mid;
}
}
}
var lastTime = new Date();
console.log(lastTime-firstTime);
執行上述代碼,20次,計算得到平均時間爲1543ms;
arr=[2,51,159,45,42,126,144,123,159,1444,1587];
//一個無序數組
var len = arr.length-1;
//把長度拿出來避免多次查找;
//將len的值賦予k,讓k遞減,以此消除冒泡完成後的多餘對比
for(var k = len,i = 0;i < len;i++,k--){
for (var j = 0;j < k;j++){
if(arr[j]<arr[j+1]){
//來個中間量,起到儲存的作用;
var mid;
mid = arr[j];arr[j]=arr[j+1];arr[j+1]=mid;
}
}
}
console.log(arr);
//測試表明代碼執行正常,接下來看一哈是否會提升時間效率;
var firstTime = new Date();
function radom(){return parseInt(Math.random()*10000); };
var arr = [];
for(var a = 0;a < 20000;a++) {
arr.push(radom());
};
var len = arr.length-1;
//把長度拿出來避免多次查找;
for(var k = len,i = 0;i < len;i++,k--){
for (var j = 0;j < k;j++){
if(arr[j]<arr[j+1]){
//來個中間量,起到儲存的作用;
var mid;
mid = arr[j];arr[j]=arr[j+1];arr[j+1]=mid;
}
}
}
var lastTime = new Date();
console.log(lastTime-firstTime);
測試結果爲980ms,似乎好像優化了40%的時間