算法学习系列 -- 二分查找

Posted 躬匠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习系列 -- 二分查找相关的知识,希望对你有一定的参考价值。

二分查找可以说是最常见的查找了,再加上最近在系统梳理算法相关的内容,本着实践大于理论的原则,争取对于常见的算法都手动撸一遍。

OK,废话少说,直接上php版本的二分查找算法。

如果元素不存在,下面的算法会返回元素会被插入的位置。

<?php 

//对于二分查找算法而言,要求数据是有序的O(logn)
//而对于二叉查找树而言(logn),要求数据是无序的,否则就会退化为顺序查找O(n)
function searchInsert($nums, $target) 
	$minIndex = 0;
	$maxIndex = count($nums) - 1;
	
	if ($target < $nums[0]) 
		return 0;
	
	if ($target > $nums[$maxIndex]) 
		return $maxIndex + 1;
	
	
	//二分查找
	while($minIndex <= $maxIndex) 
		$midIndex = ($maxIndex + $minIndex) >>1;
		if ($nums[$midIndex] == $target) 
			return $midIndex;
		 else if ($nums[$midIndex] > $target) 
			$maxIndex = $midIndex - 1;
		 else 
			$minIndex = $midIndex + 1;
		
	
	
	return $minIndex;


$nums = array(1,3,5,6);
$res = searchInsert($nums, 2);
echo 'the position of the element is:' . $res;

这里,有以下几个需要特殊注意的点:

  • 为了避免两个整数相加越界,一定要使用left + (right - left) /2 或者 右移来获取中间位置的索引值;建议使用右移,因为右移的效率更高
  • 当中间值不满足要求时,对于left / right进行加减一操作
  • 该算法的运用要求元素是有序的

以上是关于算法学习系列 -- 二分查找的主要内容,如果未能解决你的问题,请参考以下文章

经典算法系列之:二分查找

经典算法系列之:二分查找

二分查找算法合集-1

死磕算法之二分查找法

从零开始学算法:4.二分查找

算法系列之七 二分查找