PHP查找算法之二分查找(折半查找)

本文详细介绍了折半查找算法的实现原理,包括递归和非递归两种方式,并通过PHP代码示例展示了如何在一个有序数组中查找特定元素的过程。

折半查找意为从把数组从中间分成两半,找到一个中间值,然后进行判断,首先这个数组一定是从大到小或者从小到大排好序的。

下面的代码里数组是从小到大排序的。

递归形式的:

<?php
//定义一个从小到大排好序的数组
$arr = [12 , 34 , 43 , 56 , 77 , 86 , 88 , 90 , 99 , 101];
//要查找的数字
$num = 88;
$count = count($arr);
//二分查找(折半查找)递归
function search($arr , $num , $start , $stop){
	//计算数组中间位置并取出对应的值
	$mkey = ceil(($start + $stop)/2);
	//判断取出来的中间值是否是要查找的值,如果是直接返回对应索引
	if ($arr[$mkey] == $num) {
		return $mkey;
	}
	//判断中间位置的值是否大于要查找的值,那么就从左边区域查找,起始位置不变,结束位置=中间位置-1
	if ($arr[$mkey] > $num) {
		$stop = $mkey - 1;
	}
	//判断中间位置的值是否小于要查找的值,那么就从右边区域查找,结束位置不变,起始位置=中间位置+1
	if ($arr[$mkey] < $num) {
		$start = $mkey + 1;
	}
	//如果起始位置大于结束位置那么就终止
	if ($start > $stop) {
		return false;
	}

	return search($arr , $num , $start , $stop);
}
print_r(search2($arr , $num , 0 , $count));

非递归形式的:

<?php
//定义一个从小到大排好序的数组
$arr = [12 , 34 , 43 , 56 , 77 , 86 , 88 , 90 , 99 , 101];
//要查找的数字
$num = 88;
$count = count($arr);
//二分查找(折半查找)非递归
function search2($arr , $num , $start , $stop){
	//如果其实位置小于等于结束位置的话就走循环,否则终止
	while ($start <= $stop) {
		//计算数组中间位置并取出对应的值
		$mkey = ceil(($start + $stop)/2);
		//判断中间位置的值是否是要查找的值,如果是直接返回对应的下标
		if ($arr[$mkey] == $num) {
			return $mkey;
		}
		//判断中间位置的值是否大于要查找的值,那么就从左边区域查找,起始位置不变,结束位置=中间位置-1
		if ($arr[$mkey] > $num) {
			$stop = $mkey - 1;
		}
		//判断中间位置的值是否小于要查找的值,那么就从右边区域查找,结束位置不变,起始位置=中间位置+1
		if ($arr[$mkey] < $num) {
			$start = $mkey + 1;
		}
	}

	//结束
	return false;
}

print_r(search2($arr , $num , 0 , $count));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值