public static int getIndex(int[] arr,int value){
# 定义最大索引,最小索引
int max = arr.length - 1;
int min = 0;
# 计算中间索引
int mid = (min+max)/2;
# 中间索引的值和要查找的值进行比较
while(arr[mid] != value){
if(arr[mid] > value){
max = mid - 1;
}elseif(arr[mid] < value){
min = mid + 1;
}
if(min > max){
return -1;
}
mid = (min+max)/2;
}
return mid;
}
二叉树查找算法
1、二分查找算法是在有序数组中用到的较为频繁的一种算法,二分查找算法则更优
2、在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历
3、譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
第一步:查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找;
第二步:寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。
4、 二分查找算法就是不断将数组进行对半分割,每次拿中间元素和需要查找的元素进行比较。
BinarySearch.php
<?php
class BinarySearch{
public function find($need){
$arr = array(1,2,3,4,5,6,7,8,9,10);
$start = 0;
$end = count($arr)-1;
$count = 0;
while($start <= $end) {
$count++;
$mid = floor(($start + $end) / 2);
#找到元素
if($arr[$mid] == $need){
return "参数".$need. "在数组中的下标为".$mid .",查找次数为".$count;
}
#中元素比目标大,查找左部
if($arr[$mid] > $need){
$end = $mid - 1;
}
#中元素比目标小,查找右部
if($arr[$mid] < $need){
$start = $mid + 1;
}
}
}
}
$BinarySearch = new BinarySearch();
echo $BinarySearch->find(1);
binary_search.php
<?php
/**
* 数组二分查找
* @param array $arr 需要检索的数据
* @param integer $need 查找的数
* @param integer $begin 开始的位置 起始(默认)为0
* @param integer $end 结束位置 默认最后
* @return integer 找到返回该数下标 失败返回false
*/
$arr=array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
$index=binary_search($arr,'1');
echo $index;
function binary_search($arr, $need, $begin=0, $end=null){
if (is_null($end)) {
$end = count($arr)-1;
}
//得到数组中间位置
$mid_index = floor(($begin+$end)/2);
//中间数如果正好相等 返回索引退出
if ($arr[$mid_index] == $need) {
// echo '=';
return $mid_index;
}
//中间数若大于查找数 标识在其左边 左边数据递归操作
if ($arr[$mid_index] > $need) {
//数组最小数都大于查找数 直接返回false
if ($arr[0] > $need) {
return false;
}
// echo '-';
$ret = binary_search($arr, $need, $begin, $mid_index-1);
}else{
if ($arr[$end] < $need) {
return false;
}
// echo '+';
$ret = binary_search($arr, $need, $mid_index+1, $end);
}
return $ret;
}
?>