求數組的最大值和最小值


給定一個數組array求最大值和最小值:

1.一般做法:

算法1的主要思想是在自定義的min()函數和max()函數中,通過循環由第一個值依次與后面的值作比較,動態更新最大值和最小值,從而找到結果

// 最小值
Array.prototype.min = function() {
   var min = this[0];
   var len = this.length;
   for (var i = 1; i < len; i++){
        if (this[i] < min){
            min = this[i];
        }
   }
   return min;
};
//最大值
Array.prototype.max = function() {
   var max = this[0];
   var len = this.length;
   for (var i = 1; i < len; i++){
       if (this[i] > max) {
           max = this[i];
       }
   }
   return max;
};

 

2.借助Math對象的min()函數和max()函數

算法2的主要思想是通過apply()函數改變函數的執行體,將數組作為參數傳遞給apply()函數。這樣數組就可以直接調用Math對象的min()函數和max()函數來獲取返回值

// 最大值
Array.max = function(array) {
   return Math.max.apply(Math, array);
};
// 最小值
Array.min = function(array) {
   return Math.min.apply(Math, array);
};

 

3.優化上面做法:

在算法2中將min()函數和max()函數作為Array類型的靜態函數,但並不支持鏈式調用,我們可以利用對象字面量進行簡化。

// 最大值
Array.prototype.max = function() {
   return Math.max.apply({}, this);
};
// 最小值
Array.prototype.min = function() {
   return Math.min.apply({}, this);
};

上面的算法代碼中apply()函數傳入的第一個值為{},實際表示當前執行環境的全局對象。第二個參數this指向需要處理的數組。
由於apply()函數的特殊性,我們還可以得到其他幾種實現方法。將apply()函數的第一個參數設置為null、undefined或{}都會得到相同的效果。

4. 借助Array類型的reduce()函數

主要思想是reduce()函數不設置initialValue初始值,將數組的第一個元素直接作為回調函數的第一個參數,依次與后面的值進行比較。當需要找最大值時,每輪累加器返回當前比較中大的值;當需要找最小值時,每輪累加器返回當前比較中小的值

// 最大值
Array.prototype.max = function () {
   return this.reduce(function (preValue, curValue) {
       return preValue > curValue ? preValue : curValue;  // 比較后,返回大的值
   });
};
// 最小值
Array.prototype.min = function () {
   return this.reduce(function (preValue, curValue) {
       return preValue > curValue ? curValue : preValue;  // 比較后,返回小的值
   });
};

5. 借助Array類型的sort()函數

主要思想是借助數組原生的sort()函數對數組進行排序,排序完成后首尾元素即是數組的最小、最大元素。
默認的sort()函數在排序時是按照字母順序排序的,數字都會按照字符串處理,例如數字11會被當作"11"處理,數字8會被當作"8"處理。在排序時是按照字符串的每一位進行比較的,因為"1"比"8"要小,所以"11"在排序時要比"8"小。對於數值類型的數組來說,這顯然是不合理的,所以需要我們自定義排序函數。

var sortFn = function (a, b) {
   return a - b;
 };
var arr5 = [2, 4, 10, 7, 5, 8, 6];
var sortArr = arr5.sort(sortFn);
// 最小值
console.log(sortArr[0]); // 2
// 最大值
console.log(sortArr[sortArr.length - 1]); // 10
得到數組的最小值為“2”,最大值為“10”。

6.借助ES6的擴展運算符

算法6的主要思想是借助於ES6中增加的擴展運算符(...),將數組直接通過Math.min()函數與Math.max()函數的調用,找出數組中的最大值和最小值。
根據以上的分析,得到以下的代碼。
var arr6 = [2, 4, 10, 7, 5, 8, 6]
// 最小值
console.log(Math.min(...arr6));
// 最大值
console.log(Math.max(...arr6));
得到數組的最小值為“2”,最大值為“10”。
一共講解了6種求數組中最大值和最小值的方法。實際運用時推薦算法3,如果追求代碼的簡潔,推薦算法6,不過它需要ES6提供支持。


免責聲明!

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



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