js的冒泡算法的研究

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%的時間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章