二叉树查找简单算法

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;  
    }    
?>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值