二分法查找给定数组中的键值

<?php

//演示数组的二分查找算法:
//前提:
//1,索引数组;
//2,数组是已经排好序的了。
$arr1 = [2, 5, 8, 10, 15, 18, 22, 24, 24, 28,33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70];
$search = 18;    //具体分析,可以将该数据修改为不同的值,比如:2, 5, 8,
//原理:每次都找该数组的某一段的中间项,并跟要找的目标进行“对比”
//1,如果刚好相等,则就算找出来了
//2, 如果中间项比目标大,就只要去左边的那一半中找
//3, 如果中间项比目标小,就只要去右边的那一半中找

//假设有这么一个函数,它能够从某个数组$arr中的某个下标范围($start---$end)中找指定的数据$value
//这里,假设:$start一定是不能大于$end,否则,我们就认为找不到了!
function binary_search($arr, $value, $start, $end)
{
    if ($start > $end) {
        return false;
    }

    $mid = floor(($start + $end) / 2);    //取得两个下标中的中间下标(一半位置)
    $mid_value = $arr[$mid];    //中间项的值
    //如果刚好相等,则就算找出来了
    if ($mid_value == $value) {
        return '下标值:'.$mid;
    } //如果中间项比目标大,就只要去左边的那一半中找
    elseif ($mid_value > $value)    //
    {
        $new_start = $start;
        $new_end = $mid - 1;
        return binary_search($arr, $value, $new_start, $new_end);
    } //如果中间项比目标小,就只要去右边的那一半中找
    else {
        $new_start = $mid + 1;
        $new_end = $end;
        return binary_search($arr, $value, $new_start, $new_end);
    }

}

$len = count($arr1);
$result = binary_search($arr1, $search, 0, $len - 1);
var_dump($result);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值