相关链接

思维导图:https://kdocs.cn/l/sptprEzrCRMi

故事背景

试想一下,在一个保存100个联系人里面,我要想快速找到某一个人,最多需要多少次。因为通讯录是按照abcd依次排序,我只需要7次就可以命中。因为 log2 100 等于7

示例图

从给定的数字中,命中给定值(85):1,2,6,8,9,10,15,19,35,49,60,61,70,85,90,99,100

image-20210202005636033

PHP实现

<?php
// 二分查找法
function binSearch($arr, $search)
{
    $height = count($arr)-1;$low = 0;
    while ($low <= $height) {
    $mid = floor(($low + $height) / 2);//获取中间数
    if ($arr[$mid] == $search) {
      return $mid;//返回
    } elseif ($arr[$mid] < $search) {//当中间值小于所查值时,则$mid左边的值都小于$search,此时要将$mid赋值给
      $low $low = $mid + 1;
    } elseif ($arr[$mid] > $search) {//中间值大于所查值,则$mid右边的所有值都大于$search,此时要将$mid赋值给$height
      $height = $mid-1;
    }
  }
  return "查找失败";
}

// 顺序查找法
function seqSearch($arr, $k)
{
  foreach ($arr as $key => $val) {
    if ($val == $k) {
      return $key;
    }
  }
  return -1;
}// 测试

$arr=array(5,10,19,22,33,44,48,55,60,68);
// echo binSearch($arr,44).'<br/>';
// echo seqSearch($arr,44).'<br/>';