對選擇法和冒泡法的一些見解


  之前對選擇法和冒泡法的概念有點犯暈,秉着死記的心思去學它。今天看對象的時候,不小心看到排序,就靜下心來回憶選擇法和冒泡法的代碼,記憶細胞實在不給力,基本上忘光了。哎,本人對此有強迫症,就開始分析實現方式,所以就有了下面的代碼。

  先做一個說明,選擇法和冒泡法的主要作用是將數組升序或者降序,我這里着重講解降序,寫下以下數組。

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]);
                    }
                }

  最后,非常感謝大家能夠看完。有哪里講解的不好或者是不正確的地方,希望大家能第一時間反饋給我,希望和大家共同進步,謝謝~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM