十八、二分查找 (由一个数找在数组中的位置)
2015-01-17 23:07
281 查看
<?php
//二分查找
//目标:找一个数据(31)在该数组中的位置
$v1 = 15;
$arr2 = array( 3, 4, 5, 15, 19, 21, 25, 30, 30, 30, 33, 38, 44, 51, 52, 55, 60, 77, 80, 82, 83);
//$arr: 要从中找数据的数组
//$v: 要找的数据
//$start: 要从该数组中查找的开始位置
//$start: 要从该数组中查找的结尾位置
function binary_search($arr, $v, $start, $end){
if($start > $end)return false;
$mid = floor(($start + $end)/2); //计算出中间项的位置
if($v == $arr[$mid]){
return $mid; //第一次就找到了
}
else if($v < $arr[$mid]){ //此时就只要去“左边那一半”找了
$start = $start; //左边位置还是左边位置
$end = $mid - 1; //右边位置就应该是$mid - 1;
//if($start > $end)return false;
return binary_search($arr, $v, $start, $end);
}
else{
$start = $mid + 1; //左边位置就应该是$mid + 1
$end = $end; //右边位置还是右边位置;
//if($start > $end)return false;
return binary_search($arr, $v, $start, $end);
}
}
$len = count($arr2);
$result = binary_search($arr2, $v1, 0, $len-1);
if($result === false){
echo "没找到";
}
else{
echo "位置为:$result";
}
?>
<?php
//二分查找
//目标:找一个数据(31)在该数组中的位置
$v1 = 15;
$arr2 = array( 3, 4, 5, 15, 19, 21, 25, 30, 30, 30, 33, 38, 44, 51, 52, 55, 60, 77, 80, 82, 83);
//$arr: 要从中找数据的数组
//$v: 要找的数据
//$start: 要从该数组中查找的开始位置
//$start: 要从该数组中查找的结尾位置
function binary_search($arr, $v, $start, $end){
if($start > $end)return false;
$mid = floor(($start + $end)/2); //计算出中间项的位置
if($v == $arr[$mid]){
return $mid; //第一次就找到了
}
else if($v < $arr[$mid]){ //此时就只要去“左边那一半”找了
$start = $start; //左边位置还是左边位置
$end = $mid - 1; //右边位置就应该是$mid - 1;
//if($start > $end)return false;
return binary_search($arr, $v, $start, $end);
}
else{
$start = $mid + 1; //左边位置就应该是$mid + 1
$end = $end; //右边位置还是右边位置;
//if($start > $end)return false;
return binary_search($arr, $v, $start, $end);
}
}
$len = count($arr2);
$result = binary_search($arr2, $v1, 0, $len-1);
if($result === false){
echo "没找到";
}
else{
echo "位置为:$result";
}
?>
相关文章推荐
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 在排序的数组中二分查找一个元素,返回在数组中它第一次出现的位置
- 利用Collections工具类查找一个字符串在字符串数组里的位置即其角标
- acm--查找一个自定数组中位置所对应的值
- 剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)
- 程序员面试金典: 9.11 排序与查找 11.5有个排序后的字符串数组,其中散布这一些空字符串,编写一个方法,找出给定字符串的位置
- 34. Search for a Range(二分查找有重复元素数组中的目标数的第一个位置和最后一个位置)
- 递增有序数组中,查找某一个数字的位置
- :输入10个整数,保存在一个数组中,在数组中查找某个数,给出是否找到的信息。如果找到了,要求输出该数在数组中所处的位置;如果找不到,输出“没有找到!
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- 【二分查找】为非负数组寻找一个上限cap,使得数组的和为给某个给定的数s
- 程序员面试金典: 9.11 排序与查找 11.1编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置。
- 利用二分查找在循环递增数组中检索一个元素
- 输入连续有序数组,数组中有一个数字丢失,二分查找
- 查找一个list中各个数组的元素在一个固定数组中的位置, 并把位置信息记录到一个矩阵里
- 在一个旋转过的有序数组上实现二分查找 收藏
- 一个数组 输入一个数 查找到它的位置 插入合适的位置
- 首先 随机创建一个数组 然后对数组进行排序 后在进行二分查找
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置
- (二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置