冒泡排序的原理:javascript
看了上面的原理以後,寫了以下代碼:java
function bubbleSort(arr){ var tempValue; for(var i=0;i<arr.length;i++){ for(var j=i+1;j<arr.length;j++){ if (arr[i]>arr[j]) { tempValue=arr[i]; arr[i]=arr[j]; arr[j]=tempValue; } } } return arr; } var arry=[3, 7, 4, 9, 1, 10, 8, 6, 5, 2]; console.log(arry); console.log(bubbleSort(arry));
結果正常:web
看了一個別的網站,又對代碼作了一些改進:算法
(增長exChange值記錄是否交換順序,當整個數組再也不交換順序的時候,說明已經按順序排列,終止循環)數組
function bubbleSort(arr){ var tempValue; for(var i=0;i<arr.length;i++){ var exChange=false; for(var j=i+1;j<arr.length;j++){ if (arr[i]>arr[j]) { tempValue=arr[i]; arr[i]=arr[j]; arr[j]=tempValue; exChange=true; } } console.log(exChange); if(exChange==false){ break; } } return arr; } // var arry=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // var arry=[3, 7, 4, 9, 1, 10, 8, 6, 5, 2]; var arry=[3, 7, 4, 9, 1, 10, 8, 5, 6, 2]; console.log(arry); console.log(bubbleSort(arry));
這個代碼只對順序的狀況才能提升效率:數據結構
這個代碼產生排序錯誤的狀況:學習
緣由多是別的的代碼採用的是自下而上的掃描方式,而我是採用順序掃描的,所以我修改了代碼的掃描順序:網站
//這是個人代碼 function bubbleSort(arr){ var tempValue; for(var i=0;i<arr.length;i++){ var exChange=false; for(var j=arr.length-1;j>=i;j--){ console.log(arr[i],arr[j]); if (arr[i]>arr[j]) { tempValue=arr[i]; arr[i]=arr[j]; arr[j]=tempValue; exChange=true; } } console.log(exChange); if(exChange==false){ break; } } return arr; } // var arry=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var arry=[1, 2, 3, 4, 5, 6, 7, 8, 10, 9]; // var arry=[3, 7, 4, 9, 1, 10, 8, 5, 6, 2]; console.log(arry); console.log(bubbleSort(arry));
而後結果也不對:url
錯誤的緣由大概是當進行第一次掃描的時候,1和後面全部的值對比都沒有發生交換,exChange值存的標識是錯誤的。code
我借鑑的代碼以下(代碼正確性不得而知,主要是可以提早終止算法能夠節約點時間,以爲觀點可借鑑):
//這是仿照的代碼 void BubbleSort(SeqList R) { //R(l..n)是待排序的文件,採用自下向上掃描,對R作冒泡排序 int i,j; Boolean exchange; //交換標誌 for(i=1;i<n;i++){ //最多作n-1趟排序 exchange=FALSE; //本趟排序開始前,交換標誌應爲假 for(j=n-1;j>=i;j--) //對當前無序區R[i..n]自下向上掃描 if(R[j+1].key<R[j].key){//交換記錄 R[0]=R[j+1]; //R[0]不是哨兵,僅作暫存單元 R[j+1]=R[j]; R[j]=R[0]; exchange=TRUE; //發生了交換,故將交換標誌置爲真 } if(!exchange) //本趟排序未發生交換,提早終止算法 return; } //endfor(外循環) } //BubbleSort
最終,我是沒解決這個問題,甚至有點懷疑本身寫的是否是冒泡排序算法……
2016.09.18
以前代碼錯誤的緣由,錯把本身思路寫出來的排序當成了冒泡排序使用,在借鑑別人設置的掃描標識的時候致使錯誤(按照1樓的解答從新修改了代碼):
//這是個人代碼 function bubbleSort(arr){ var tempValue; for(var i=0;i<arr.length;i++){ var exChange=false; for(var j=0;j<arr.length-1;j++){ console.log(arr[j],arr[j+1]); if (arr[j]>arr[j+1]) { tempValue=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tempValue; exChange=true; } } console.log(exChange); if(exChange==false){ break; } } return arr; } // var arry=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var arry=[1, 2, 3, 4, 5, 6, 7, 8, 10, 9]; // var arry=[3, 7, 4, 9, 1, 10, 8, 5, 6, 2]; console.log(arry); console.log(bubbleSort(arry));
思考:
算法是對前人思路的總結,是一種精煉過的思想,學習算法讓咱們可以站在大神的高度思考問題。每一個人都有本身的思路,這也是一種算法,這種算法也許不是最好的,但咱們應努力作到最好。
參考: