二分查找算法

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


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;
}
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值