js實現氣泡排序及優化
阿新 • • 發佈:2019-02-13
就排序演算法來說氣泡排序算是比較好理解的了,設想一下這樣一個上體育課的排隊的場景。體育老師要求按身高的由低到高依次排列成一隊,假設這是這學期的第一次體育課。大家剛開始都是處於亂排的狀態,假設隊伍有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>.
(很明顯這裡不用經過五輪比較,但這只是最基本的格式,後面再討論其的優化版本)
第一輪冒泡比較之後結果:<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; }
當然有種情況這種優化也沒什麼卵用。如果剛開始這個隊伍是剛開始亂排時就恰恰是從高到底排的。就是說與我們想要的結果完全逆序。