二分查找算法

来源:互联网 发布:c语言两条和 编辑:程序博客网 时间:2024/06/02 13:24

二分查找也叫做折半查找,做二分查找的数组要求元素大小有序,二分查找一般有两种实现方式分别是递归、循环。对于二分查找也是面试或者笔试经常被问到的问题,下面分享下我自己写的二分查找算法


1.递归实现

function halfFind($findVal, $arr, $start, $end) {// 中间的位置$middle = round ( ($start + $end) / 2 );if($middle>count ( $arr ) - 1){return - 1;}// 中间位置的数值if ($start >$end) {return - 1;}if ($arr [$middle] == $findVal) {return $middle;} else if ($findVal >$arr [$middle]) {return halfFind ( $findVal, $arr, $middle + 1, $end );} else if ($findVal < $arr [$middle]) {return halfFind ( $findVal, $arr, $start, $middle - 1 );}return - 1;}

要注意第一个返回-1的地方,不写那个判断的话会出现一个警告


2.循环实现

相比前面的递归实现,这种算法更容易理解一些

function halfFind($findVal, $arr, $start, $end) {// 中间的位置$middle = round ( ($start + $end) / 2 );if($middle>count ( $arr ) - 1){return - 1;}// 中间位置的数值if ($start >$end) {return - 1;}if ($arr [$middle] == $findVal) {return $middle;} else if ($findVal >$arr [$middle]) {return halfFind ( $findVal, $arr, $middle + 1, $end );} else if ($findVal < $arr [$middle]) {return halfFind ( $findVal, $arr, $start, $middle - 1 );}return - 1;}

最后贴出全部代码,虽然是php但是基本思想都是一样的

<?php$arr = array (1,8,9,10,13,16,18 );echo find (18, $arr );echo "<br/>";echo halfFind (13, $arr, 0, count ( $arr ) - 1 );// 二分查找循环实现function find($findVal, $arr) {$start = 0;$end = count ( $arr ) - 1;if ($start > $end) {return - 1;}while ( $start <= $end ) {// 中间的位置$middle = round ( ($start + $end) / 2 );// 中间位置的数值$midVal = $arr [$middle];if ($midVal == $findVal) {return $middle;} else if ($findVal > $midVal) {$start = $middle + 1;} else if ($findVal < $midVal) {$end = $middle - 1;}}return - 1;}// 二分查找递归实现function halfFind($findVal, $arr, $start, $end) {// 中间的位置$middle = round ( ($start + $end) / 2 );if($middle>count ( $arr ) - 1){return - 1;}// 中间位置的数值if ($start >$end) {return - 1;}if ($arr [$middle] == $findVal) {return $middle;} else if ($findVal >$arr [$middle]) {return halfFind ( $findVal, $arr, $middle + 1, $end );} else if ($findVal < $arr [$middle]) {return halfFind ( $findVal, $arr, $start, $middle - 1 );}return - 1;}?>


0 0
原创粉丝点击