1 /** 2 * 二分查找 3 * @param $key 要查找的值 4 * @param $data 数据源 5 * @return int|string 返回找到结果 6 */ 7 public function halfsearch($key, $data){ 8 //统计总数 9 $count = count($data); 10 //起始位值 11 $start = 0; 12 //结束位置 13 $end = $count - 1; 14 while($end >= $start){ 15 //每次查找时的中间值 16 $mid = floor(($end + $start) / 2); 17 if($key == $data[$mid]){ 18 return $mid; 19 }elseif($key > $data[$mid]){ //比中间的值大,从右边开始找 20 $start = $mid + 1; 21 }elseif($key < $data[$mid]){ //比中间值小,从左边开始找 22 $end = $mid - 1; 23 } 24 } 25 26 return ‘not found ~‘; 27 }
虽然二分查找的效率高,但是要将数据源先排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。
二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。
因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。
原文:http://www.cnblogs.com/open-i/p/6659745.html