天天看點

按順序擷取第k個值

兩種算法都不算好,但是在一定情況下,第二種明顯由于第一種
           

從一個數組中擷取到第k個大小的值

<?php

//設一個題目确定其中第k個最大者,我們稱它為選擇問題

//第四個最大值
$arr = [3,4,5,1,2,4,6,1,32,4,6,7,1,3,4,5,6,676,756,8,5,856,7,56,7,56,756,7,56,756,7,56,756,7,567,56,756,7,56,3,123,12,3,123,12,123,11,22,3,4,55,6,665,65,65,6,5,65,6,5,65,6,56,5,23423,436,546,45,7,57,5];
//$arr = [3,4,5,6,7,1,2,3];
function newSort($arr)
{
    $len = sizeof($arr);
    for($i=0;$i<$len;$i++)
    {
        for($num=$i+1;$num<$len;$num++)
        {
            if($arr[$i] > $arr[$num])
            {
                $temp = $arr[$i];
                $arr[$i] = $arr[$num];
                $arr[$num] = $temp;
            }
        }
    }

    return $arr;
}
$res = newSort($arr);
var_dump($res[3]);
           

這種算法需要循環2485 次 

第二種取出前k個值,寫入到一個數組中,并且對其排序,接着把剩下的元素住個讀入數組,放到數組正确的位置上,進而擷取到第k個值,這種算法隻循環了88次

<?php

//設一個題目确定其中第k個最大者,我們稱它為選擇問題

//第四個最大值
$arr = [3,4,5,1,2,4,6,1,32,4,6,7,1,3,4,5,6,676,756,8,5,856,7,56,7,56,756,7,56,756,7,56,756,7,567,56,756,7,56,3,123,12,3,123,12,123,11,22,3,4,55,6,665,65,65,6,5,65,6,5,65,6,56,5,23423,436,546,45,7,57,5];
//$arr = [3,4,5,6,7,1,2,3];
function newSort($arr)
{
    $count = 0;
    $len = sizeof($arr);
    for($i=0;$i<$len;$i++)
    {
        for($num=$i+1;$num<$len;$num++)
        {
            if($arr[$i] > $arr[$num])
            {
                $temp = $arr[$i];
                $arr[$i] = $arr[$num];
                $arr[$num] = $temp;
            }
        }
    }

    return $arr;
}


//更好的算法
$data = [];
for($i=0;$i<4;$i++)
{
    $data[$i] = $arr[$i];
}
$newArr = newSort($data);

for($i=4;$i<sizeof($arr);$i++)
{
    if($arr[$i]<$newArr[3])
    {
        $newArr[3] = $arr[$i];
        $newArr = newSort($newArr);
    }
}
           

繼續閱讀