如何从排序的数组中找到最大的元素?

问题描述:

我有三个排序的数组,我需要从这些数组中找到前五个“5”元素。我能够找到前两个元素最大的元素。如何找到其他?如何从排序的数组中找到最大的元素?

你能建议我们如何找到其他3个元素?

这里是我的代码

var maxArray=[]; 
     var array1=[2,7,12,23,40,44,67,88,102] 
     var array2=[3,12,14,17,23,40,41,67,108] 
     var array3=[8,12,23,40,59,86,119,130] 
     var firstMax=array1[array1.length-1]; 
     var secondMax=array2[array2.length-1]; 


     alert(array1[array1.length-1]); 
     if(array1[array1.length-1]>array2[array2.length-1] && array1[array1.length-1]>array3[array3.length-1]){ 

      maxArray.push(array1[array1.length-1]) ; 
      firstMax=array1[array1.length-1]; 
      if(array2[array2.length-1]>array3[array3.length-1]){ 
       secondMax=array2[array2.length-1]; 
      }else { 
       secondMax=array3[array3.length-1]; 

      } 
     }else if(array2[array2.length-1]>array1[array1.length-1]&& array2[array2.length-1]>array3[array3.length-1]){ 
      maxArray.push(array1[array2.length-1]) 
      firstMax=array2[array2.length-1]; 

      if(array1[array1.length-1]>array3[array3.length-1]){ 
       secondMax=array1[array1.length-1]; 
      }else { 
       secondMax=array3[array3.length-1]; 

      } 

     }else{ 
      maxArray.push(array3[array3.length-1]) 
      firstMax=array3[array3.length-1]; 

      if(array2[array2.length-1]>array1[array1.length-1]){ 
       secondMax=array2[array2.length-1]; 
      }else { 
       secondMax=array1[array1.length-1]; 

      } 

     } 
     maxArray.push(secondMax) 

     alert(maxArray) 

小提琴 http://jsfiddle.net/9vsjm8uh/

+0

岂不是更容易建立一个合并的阵列,那种,然后弹出关闭的最后5个元素? – 2014-09-03 17:03:53

+0

@MarcB好吧,这是主意,不是吗?按降序合并数组,并在合并数组中的5个元素时停止合并? – beaker 2014-09-03 17:06:04

+0

是的,但OP的做了很多额外的工作,而不是基本的'pop_5((array1 + array2 + array3).sort())'(伪代码,当然) – 2014-09-03 17:07:58

jsFiddle(是的,即使没有更好的jQuery,感谢@Rajacsp)

var array1 = [2, 7, 12, 23, 40, 44, 67, 88, 102] 
var array2 = [3, 12, 14, 17, 23, 40, 41, 67, 108] 
var array3 = [8, 12, 23, 40, 59, 86, 119, 130] 

var flatArray = array1.concat(array2).concat(array3); 

flatArray.sort(function sortNumber(a, b) { return b - a; }); 
var maxArray = flatArray.slice(0, 5); 

alert(maxArray); // 130,119,108,102,88 
+1

使用var maxArray = flatArray.slice(0,5);提取前5个元素。 – Swetha 2014-09-03 17:13:43

+0

谢谢,更新 – 2014-09-03 17:14:55

+0

@Plantface,你为什么不坚持Jquery lib?我会得到一些投票:-) – 2014-09-03 17:24:25

我建议以下思路:

既然你正在寻找的前5个值,它们将在最坏的情况下,都在同一个列表中。因此,最多可以检查5 * 3 = 15个值。

然后,您可以从每个列表中获取5个最高值(如果列表已经排序,这应该是微不足道的),然后将它们放在另一个列表中。现在你有一个15的列表,你想从这个列表中找到前5个值。有不同的方法可以做到这一点 - 您可以对列表进行排序,然后获取前5个值,或者您可以遍历列表,每次找到最大值。

把所有的数组,对它们进行排序,然后得到最后的5个值。

var total = array1.concat(array2, array3); 
total = total.sort(function(a,b){return a-b}); 
//Now total[length-5] is the 5th largest value 
//total[length-4] is the 4th largest and so on 
+0

请注意,排序参数确保按顺序对值进行排序(即2,3,7,8,12,12等),而不是返回12,12,12,2,3,7,8的.sort()因为它按第一位数字排序)。 – 2014-09-03 17:16:35

+0

你不能用'+'连接数组。这不是PHP。 – 2014-09-03 17:18:12

+0

哈哈ooops谢谢。 – 2014-09-03 17:18:51

普通的JavaScript(不加库):

var array1=[2,7,12,23,40,44,67,88,102]; 
var array2=[3,12,14,17,23,40,41,67,108]; 
var array3=[8,12,23,40,59,86,119,130]; 


alert(getTopFive(array1, array2, array3)); 

function getTopFive(ar1, ar2, ar3){ 
    var finalArray = array1.concat(array2).concat(array3); 
    finalArray.sort(function sortInverse(a,b) { return b - a; }); 
    return finalArray.slice(0, 5); 
} 
+1

现在来了,这可能是一个很好的建议,在其他答案:D – 2014-09-03 17:20:50

+0

嗨,谢谢你回答为什么这个函数内使用的sort函数sortInverse(a,b){return a - b; } – Shruti 2014-09-03 17:40:40