之前對選擇法和冒泡法的概念有點犯暈,秉着死記的心思去學它。今天看對象的時候,不小心看到排序,就靜下心來回憶選擇法和冒泡法的代碼,記憶細胞實在不給力,基本上忘光了。哎,本人對此有強迫症,就開始分析實現方式,所以就有了下面的代碼。
先做一個說明,選擇法和冒泡法的主要作用是將數組升序或者降序,我這里着重講解降序,寫下以下數組。
var array = [10,4,1,9,2];
一、選擇法(降序)
先附上代碼:
for(var i=0;i<array.length - 1;i++){ /* i表示比較數下標,array[i]表示比較數 */ for(var j=i+1;j<array.length;j++){ /* j表示被表比較數下標,array[i]為被比較數 */ if(array[i]>array[j]){ var t = array[i]; array[i] = array[j]; array[j] = t; } } }
實現方式:是將比較數與被比較數(后面所有數)進行比較,如果array[0]>array[1|2|3...],則兩者交換位置,反之位置不變,看下圖。

總結:循環總次數是數組array的長度,array[i]表示比較數,第一次循環從第一個數開始比較,第二次循環從第二個數開始比較,依次類推……array[j]表示被比較數,循環完一次(i增加1),被比較數就少一次,被比較數總是比較數后面的數(因為不需要和自己比較)。i循環的第n - 1次已經比較出數據了,不需要比較到第n次。即使i比較到第n次,j循環也滿足不了j循環條件,(j = n + 1)j是大於數組長度的,也不會繼續往下執行了。
總歸老說,選擇法比較方式就是:
第一個數和后面所有數比較;(第一次循環)
第二個數和后面所有數比較;(第二次循環)
第三個數和后面所有數比較;(第三次循環)
……
第n-1個數和后面所有數比較;(第n-1次循環)
二、冒泡法(降序)
先附上代碼:
for(var i=0;i<array.length - 1;i++){ for(var j=0;j<array.length - 1 - i;j++){ if(array[j]>array[j+1]){ var t = array[j]; array[j] = array[j+1]; array[j+1] = t; } } }
實現方式:冒泡法和選擇法不一樣的地方在,和選擇法不一樣的是它沒有比較數和被比較數之分,因為里面的數既是比較數又是被比較數。冒泡法在循環中,第一個數和第二個數比較,第二個數和第三個比較,第三個數和第四個數比較……依次類推。如下圖:

總結:循環總次數是數組array的長度,第一次循環中,比較4次,第4次時已經找到最大最小值了,不需要再比較第5次;第二次循環中,比較3次;第三次循環中比較2次……。比較次數逐漸減少,冒泡冒泡,表示大的數都已經冒出來了,不需要比較了。循環一次,出來一個大的,再循環,再出來一個大的……依次類推,比較次數為array.length-n - 1。
總歸老說,冒泡法比較方式就是:
第一個數和第二個數,第二個數和第三個……;(第一次循環,比較次數為array.length - 1)
第一個數和第二個數,第二個數和第三個……;(第二次循環,比較次數為array.length-2)
第一個數和第二個數,第二個數和第三個……;(第三次循環,比較次數為array.length-3)
……
第一個數和第二個數,第二個數和第三個……;(第n次循環,比較次數為array.length-n - 1)
三、將冒泡法封裝成組件(封裝方式一樣,就封裝一個)
Function.prototype.method = function(name,func){ /* 將method方法加入到原型中(類似全局方法) */ this.prototype[name] = func; return this; } /* 數組升序 */ Array.method("sortUp",function(){ var own = this; /* 冒泡法 */ for(var i=0;i<own.length - 1;i++){ for(var j=0;j<own.length - 1 - i;j++){ if(own[j]>own[j+1]){ var t = own[j]; own[j] = own[j+1]; own[j+1] = t; } } } return own; })
/* 數組降序 */ Array.method("sortDown",function(){ var own = this; /* 冒泡法 */ for(var i=0;i<own.length - 1;i++){ for(var j=0;j<own.length - 1 - i;j++){ if(own[j]<own[j+1]){ var t = own[j]; own[j] = own[j+1]; own[j+1] = t; } } } return own; })
在html中調用此方法:
var array = [10,4,1,9,2]; console.log(array.sortUp()); /* 升序,輸出[1,2,4,9,10] */ console.log(array.sortDown()); /* 降序,輸出[10,9,4,2,1] */
三、數組去重
var array = [2,2,3,1,2,4,5,6,6,7,"1",1,9], hash = {},newArray = [],i = 0, perfix = ""; for(i = 0; i < array.length; i++){ if(typeof array[i] == "string"){ /* 判斷數組內容是字符串還是number */ perfix = "_str"; }else{ perfix = ""; } if(!hash[array[i] + perfix]){ hash[array[i]] = true; newArray.push(array[i]); } }
最后,非常感謝大家能夠看完。有哪里講解的不好或者是不正確的地方,希望大家能第一時間反饋給我,希望和大家共同進步,謝謝~
