1. 程式人生 > >js實現氣泡排序及優化

js實現氣泡排序及優化

    就排序演算法來說氣泡排序算是比較好理解的了,設想一下這樣一個上體育課的排隊的場景。體育老師要求按身高的由低到高依次排列成一隊,假設這是這學期的第一次體育課。大家剛開始都是處於亂排的狀態,假設隊伍有n個人。這時體育老師行動了。讓隊伍的第一個同學與第二個同學開始比較。把高的同學往後排。接著第二與第三比較。把高的往後排,就這樣依次兩兩比較。第一輪比較完(我們就把這樣的比較親切的稱為冒泡比較),隊伍中最高的那位同學就被排到了最後,這個同學就不必參加接下來的比較了。接著第二輪比較,隊伍中次高的同學就會往後排到後面,就這樣經過n輪比較,隊伍整齊劃一。好,我們假設一個5個人隊伍的最初的身高排列列是這樣的<165cm,160cm,178cm,180cm,170cm>;
第一輪冒泡比較之後結果:<160cm,165cm,178cm,170cm,180cm>;
第二輪冒泡比較之後結果:<160cm,165cm,170cm,178cm,180cm>;
第三輪冒泡比較之後結果:<160cm,165cm,170cm,178cm,180cm>;
第四輪冒泡比較之後結果:<160cm,165cm,170cm,178cm,180cm>;
第五輪冒泡比較之後結果:<160cm,165cm,170cm,178cm,180cm>.
(很明顯這裡不用經過五輪比較,但這只是最基本的格式,後面再討論其的優化版本)

    下面就用js編寫最初版本的氣泡排序演算法:

function bubbleSort(array){
		var len=array.length,
			temp=0;//儲存交換的值
		for(var i=0;i<len;i++){
			for(var j=0;j<len-i-1;j++){
				if(array[j]>array[j+1]){
					temp=array[j];
					array[j]=array[j+1];
					array[j+1]=temp;
				}
			}
		}
		return array;
	}


    我們接著討論氣泡排序的優化演算法,其關鍵在於每輪都記錄最後一次發生交換的位置。假設本輪的最後一次交換髮生在隊伍m的位置中,就說明隊從(m,n]的位置已經的同學已經歸位了,下一輪只要冒泡比較剩下的位置從[1,m]的同學就好了,當最後的冒泡比較不發生交換時也就說明整個隊伍所有人都歸位了。前面那個例子;
第一輪冒泡比較之後結果:<160cm,165cm,178cm,170cm,180cm>最後發生交換的位置為4;
第二輪輪冒泡比較之後結果:<160cm,165cm,170cm,178cm,180cm>最後發生交換的位置為3;
第三輪輪冒泡比較之後結果:<160cm,165cm,170cm,178cm,180cm>最後發生交換的位置為0.(我們可以設定初始的交換位置為0)結束冒泡比較。

    我們在這裡可以很明顯的看出冒泡比較的次數變少了。當然當我們的資料夠多時。其對於我們每次冒泡比較的中兩兩比較的次數也是有減少的,下面給出優化版的js程式碼:

function bubbleSort(array){
		var n=array.length-1,temp=0;
		while(n!=0){
			var Off=true,//該值用來判斷不發生交換時把n置為0;
				len=n;//儲存n的值,避免與n衝突。
			for(var i=0;i<len;i++){
				if(array[i]>array[i+1]){
					temp=array[i];
					array[i]=array[i+1];
					array[i+1]=temp;
					Off=false;
					n=i;//記錄最後一次發生交換的值;
				}
			}
			if(Off)n=0;
		}
		return array;
	}


    當然有種情況這種優化也沒什麼卵用。如果剛開始這個隊伍是剛開始亂排時就恰恰是從高到底排的。就是說與我們想要的結果完全逆序。