PHP实现二分查找(递归与非递归)

简介:
二分查找技术,又称为折半查找。它的前提是线性表中的记录必须是关键码有序(通常从小到达有序),线性表必须采用顺序存储。

基本思想:
在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

代码:

//二分搜索(折半查找)算法(前提是数组必须是有序数组) 时间复杂度是 O(logn)

$i = 0;    //存储对比的次数
//非递归
//@param 待查找数组
//@param 待搜索的数字
function binsearch($arr,$num){
    $count = count($arr);
    $lower = 0;
    $high = $count - 1;
    global $i;

    while($lower <= $high){

        $i ++; //计数器

        if($arr[$lower] == $num){
            return $lower;
        }
        if($arr[$high] == $num){
            return $high;
        }

        $middle = intval(($lower + $high) / 2);
        if($num < $arr[$middle]){
            $high = $middle - 1;
        }else if($num > $arr[$middle]){
            $lower = $middle + 1;
        }else{
            return $middle;
        }
    }


/**
* 递归
* @param array $array 数组
* @param int $low 数组起始元素下标
* @param int $high 数组末尾元素下标
* @param $k 要查找的元素
* @return mixed 成功时返回数组下标,失败返回-1
*/

function bin_sch($array,$low,$high,$k){

  if ($low <= $high){

	$mid = intval(($low + $high) / 2);

	if ($array[$mid] == $k) {

		return $mid;

	} elseif ($k < $array[$mid]) {

		return bin_sch($array,$low,$mid - 1,$k);

	} else {

		return bin_sch($array,$mid + 1,$high,$k);

	}

 }

 return -1;

}

    //返回-1表示查找失败
    return -1;
}


总结:
二叉查找的时间复杂度是 O(logn)。不过由于二叉查找的前提条件是需要有序表顺序存储(数组),如果该有序表需要频繁的执行插入或删除操作,维护有序的排序会带来不小的工作量。

本篇博客参考自《大话数据结构》,在此仅作记录,方便以后查阅,大神勿喷!
--------------------- 
作者:LSGOZJ 
来源:优快云 
原文:https://blog.youkuaiyun.com/baidu_30000217/article/details/53056977 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值