【技术宅10】顺序二分查找算法
//顺序查找
//顺序查找是在一个已知无序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。
function search($array,$k){
$n = count($array); //count函数用于计算数组中的元素个数
$array[$n] = $k; //新建一个元素,并将k存放进去
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{ //否则,返回-1
return false;
}
}
$array = array(5,6,3,6,87,6); //测试search函数
echo search($array, 6);//1 //调用search函数并输出查找结果
// 二分查找
//【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
//【算法过程】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
/**二分查找:查找一个值在数组中的位置
* @$arr:操作的数组,前提是按顺序排列
* @$val:查找的值
* @$low:查找的起始位置,默认从数组的第一个数找起
* @hight:查找的结束位置
**/
function binarySearch($arr, $val, $hight, $low=0){
while($low <= $hight){
$mid = ceil($low + ($hight - $low) / 2);
if($arr[$mid] == $val){
return $mid;
}elseif($arr[$mid] > $val){
$hight = $mid -1;
}else{
$low = $mid +1;
}
}
return -1;
}
//产生一个数组
$arr = range(0,20);
echo '<pre>';
print_r($arr);
echo '</pre>';
$low = 0;
$hight = count($arr) - 1;
$findVal = rand(0, 20);
$index = binarySearch($arr, $findVal, $hight, $low);
printf("查找的值 '%d',在数组中的下标 '%s'", $findVal, $index);//查找的值 '1' 在数组中的下标 '1'