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