1.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组[转]
2.顺序查找
<?php
//$n为待查找的数组元素的个数,$k为待查找的元素
function seq_sch($array, $n, $k)
{
$array[$n] = $k;
for($i=0; $i<$n; $i++)
{
if($array[$i]==$k)
{
return true;
break;
}
}
if ($i<$n) //判断是否到数组的末尾
{
return $i;
}
else
{
return false;
}
}
$array = array(3, 6, 1, 9, 2, 10);
$n = count($array);
$k = 8;
if(seq_sch($array, $n, $k))
{
echo "顺序查找成功";
}
else
{
echo "顺序查找失败";
}
?>
顺序查找是在一个已知无序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。
3.二分查找
<?php
//$low为待查找的数组中的最小值,$high为数组中的最大值,$k为要查找的关键字
function bin_sch($array, $low, $high, $k)
{
if ($low <= $high)
{
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k)
{
return true;
}
elseif ($k < $array[$mid])
{
return bin_sch($array, $low, $mid-1, $k);
}
else
{
return bin_sch($array, $mid+1, $high, $k);
}
}
return false;
}
$array = array(1, 2, 4, 6, 8);
$low = min(1, 2, 4, 6, 8);
$high = max(1, 2, 4, 6, 8);
$k = 8;
if(bin_sch($array, $low, $high, $k))
{
echo "二分查找成功";
}
else{
echo "二分查找失败";
}
?>
【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
【算法过程】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
实例:
1, 2, 4, 6, 8
假设要查找的关键字为2。
首先找出该数值中中间位置的数,即4,与关键字2比较,两数不等,则将数组以中间位置关键字4为分界点分为前后两个字表,即
{1 2}和{6 8}
中间位置关键字4大于要查找的关键字2,所以查前一个子表{1 2},该字表中有2,查找成功。