二分查找

Dec 2, 2015


非递归


		function binarySearch($arr,$key){
			$low=0;
			$high=count($arr)-1;
			while($low<=$high){
				$mid=floor(($low+$high)/2);
				if($arr[$mid]==$key){
					return $mid;
				}
				if($arr[$mid]>$key){
					$high=$mid-1;
				}
				if($arr[$mid]<$key){
					$low=$mid+1;
			}

		}
		return -1;
	}
		$array=array(1,5,6,7,8,33,44,66);
		echo binarySearch($array,44);

递归


			function binarySearch($arr,$low,$high,$key){
				if($low<=$high){
					$mid=floor(($low+$high)/2);
					if($key==$mid){
						return $mid;
				}
					if($key<$mid){
						return binarySearch($arr,$low,$mid-1,$key);
				}
					if($key>$mid){
						return binarySearch($arr,$mid+1,$high,$key);
				}
			}
			return -1;
		}
		$array=array(1,5,6,7,8,33,44,66);
		echo binarySearch($array,0,7,44);



	测试运行结果:6

###算法要求:

1.必须采用顺序存储结构

2.必须按关键字大小有序排列。

###算法复杂度

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.时间复杂度无非就是while循环的次数! 所以时间复杂度可以表示O()=O(logn)