两种算法都不算好,但是在一定情况下,第二种明显由于第一种
从一个数组中获取到第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);
}
}