如何在不使用max函数的情况下在数组中找到最高和第二高的数字

时间:2014-10-19 08:33:44

标签: php arrays

我已经有了解决方案。但我认为它会更加优化。所以请为我提供一个解决方案。请记住,不要使用PHP的预定义功能。像max()函数一样。 我知道有很多方法可以找到它,但我想要最好和更好的解决方案。因为我的数组包含超过10万条记录,并且需要花费大量时间。或者某个时候网站会关闭。

我的代码:

<?php 

$array = array('1', '15', '2','10',4);

echo "<pre>";
print_r($array);
echo "<pre>";
$max = 0;
$s_max=0;

for($i=0; $i<count($array); $i++)
{
    $a = $array[$i];
    $tmax = $max;
    $ts_max = $s_max;
    if($a > $tmax && $a > $ts_max)
    {
        $max = $a;
        if($tmax > $ts_max) {
            $s_max = $tmax;
        } else {
            $s_max = $ts_max;
        }
    } else if($tmax > $a && $tmax > $ts_max)
    {
        $max = $tmax;
        if($a > $ts_max) {
            $s_max = $a;
        } else {
            $s_max = $ts_max;
        }
    } else if($ts_max > $a && $ts_max > $tmax)
    {
        $max = $ts_max;
        if($a > $tmax)
        {
            $s_max = $a;
        } else {
            $s_max = $tmax;
        }
    }
}
echo "Max=".$max;
    echo "<br />";
    echo "S_max=".$s_max;
    echo "<br />";

?>

8 个答案:

答案 0 :(得分:7)

<?php 
$array = array('200', '15','69','122','50','201');
$max_1 = $max_2 = 0;

for($i=0; $i<count($array); $i++)
{
    if($array[$i] > $max_1)
    {
      $max_2 = $max_1;
      $max_1 = $array[$i];
    }
    else if($array[$i] > $max_2)
    {
      $max_2 = $array[$i];
    }
}
echo "Max=".$max_1;
echo "<br />"; 
echo "Smax 2=".$max_2;

答案 1 :(得分:2)

请参阅此解决方案。

<?php 

 $numbers = array_unique(array(1,15,2,10,4)); 
// rsort : sorts an array in reverse order (highest to lowest).

 rsort($numbers); 

 echo 'Highest is -'.$numbers[0].', Second highest is -'.$numbers[1];

 // O/P: Highest is -15, Second highest is -10
 ?>

答案 2 :(得分:1)

我没有检查你的解决方案,但就复杂性而言,这是IMO的最佳选择。如果数组没有更多结构信息(如它的排序),则无法跳过条目。即最好的解决方案是在你的解决方案中的O(n)。

答案 3 :(得分:0)

“ Kanishka Panamaldeniya”给出的答案适合最高值,但在第二最高值时将失败,即,如果数组具有两个相似的最高值,则它将显示最高值和第二最高值。我通过添加一个级别比较来进行排序,效果很好。

$array = array(50,250,30,250,40,70,10,50); // 250  2-times
$max=$max2=0;
for ($i = 0; $i < count($array); $i++) {
if ($array[$i] > $max) {
    $max2 = $max;
    $max = $array[$i];
} else if (($array[$i] > $max2) && ($array[$i] != $max)) {
    $max2 = $array[$i];
}
}
echo "Highest Value is : " . $max . "<br/>"; //output : 250
echo "Second highest value is : " . $max2 . "<br/>"; //output : 70

答案 4 :(得分:0)

此代码将从数组返回第二个最大值

$array = array(80,250,30,250,40,90,10,50,60,50); // 250  2-times
$max=$max2=0;

for ($i = 0; $i < count($array); $i++) {

    if($i == 0) {

        $max2 = $array[$i];
    }

    if($array[$i] > $max) {

        $max = $array[$i];

    }

    if($max > $array[$i] && $array[$i] > $max2) {

        $max2 = $array[$i];
    }



   }    


echo "Highest Value is : " . $max . "<br/>"; //output : 250
echo "Second highest value is : " . $max2 . "<br/>"; //output : 90

答案 5 :(得分:0)

$array = array(80,250,30,40,90,10,50,60,50);            // 250  2-times
$max=$max2=0;

foreach ($array as $key =>$val) {

    if($max < $val) {
        $max2 =$max;
        $max = $val;        
    }

    elseif(($max2 < $val) && ($max!=$val) {
        $max2 = $val;
    }
}

echo "Highest Value is : " . $max . "<br/>";           //output: 250
echo "Second highest value is : " . $max2 . "<br/>";   //output: 90

答案 6 :(得分:0)

这是一个完美,最短的代码,可以从数组中找出第二大的值。如果数组仅包含一个值,下面的代码将始终返回值。

Example 1.
    $arr = [5, 8, 1, 9, 24, 14, 36, 25, 78, 15, 37];
    asort($arr);
    $secondLargestVal = $arr[count($arr)-1];

    //this will return 37

Example 2.

    $arr = [5];
    asort($arr);
    $secondLargestVal = $arr[count($arr)-1];
    //this will return 5

答案 7 :(得分:0)

你也可以使用冒泡排序之类的排序技术

function bubble_Sort($my_array )
{
    do
    {
        $swapped = false;
        for( $i = 0, $c = count( $my_array ) - 1; $i < $c; $i++ )
        {
            if( $my_array[$i] > $my_array[$i + 1] )
            {
                list( $my_array[$i + 1], $my_array[$i] ) =
                        array( $my_array[$i], $my_array[$i + 1] );
                $swapped = true;
            }
        }
    }
    while( $swapped );
return $my_array;
}

$test_array = array(3, 0, 2, 5, -1, 4, 1);
echo "Original Array :\n";
echo implode(', ',$test_array );
echo "\nSorted Array\n:";
echo implode(', ',bubble_Sort($test_array)). PHP_EOL;

Original Array :                                                    
3, 0, 2, 5, -1, 4, 1                                                
Sorted Array :                                                      
-1, 0, 1, 2, 3, 4, 5

流程说明 enter image description here