二分查找数组中 n 所在的位置
关于一个排列好的数组需要找出,n 在数组所在的位置。如
$arr = array(1,2,3,3,3,3,4,4,5,6,7,8,9);
找出 4 在$arr 里的那个位置,可以看出是在$arr[6]。
思路: 二分法
去数组中间的数middle,如果middle> n 那么往左(数组开始-middle)找否则往右找(middle-数组结尾),以此类推
时间复杂度:O(logn)
PHP代码如下:
<?php global $begin; $begin = 0; function minf($n,$arr){ global $begin; // CO($arr,1); // CO('开始位置:'.$begin,1); if( count($arr) <= 1){ return 0;} $middle = intval( count($arr)/2 ); $arr_left = array_slice($arr,0,$middle); $arr_right = array_slice($arr,$middle,$len-1); // echo'分割点:'.$middle.'<br>'; // echo '分割点数据和$n:'.$arr[$middle],' - ',$n; if( $arr[$middle] > $n ){ return minf($n,$arr_left); }elseif( $arr[$middle] < $n ){ $begin += $middle; return minf($n,$arr_right); }elseif( $arr[$middle] == $n ){ if( $arr[$middle - 1] == $n && $middle != 0 ){ return minf($n,$arr_left); } elseif( $arr[$middle + 1] == $n && $middle != $len ){ $begin += $middle; return minf($n,$arr_right); } else{ return $middle; } } } $arr = array(1,2,3,3,3,3,4,4,5,6,7,8,9); echo '<br>'.($begin + minf(4,$arr)); ?>