兩種算法都不算好,但是在一定情況下,第二種明顯由于第一種
從一個數組中擷取到第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);
}
}