1. 程式人生 > >二分查詢(數組裡查詢某個元素)

二分查詢(數組裡查詢某個元素)

二分查詢(折半查詢) 陣列元素有序 陣列的元素必須有順序,從小到大或者從大到小。 1、定義一個有序的陣列

<?php
$max = 10000;  // 陣列最大值
$number = 1;  // 陣列開始值
$arr = []; // 陣列
while ( $number <= $max ){
    $arr[] = $number;
    $number ++ ;
}
?>

// 1、二分查詢
// $arr 陣列 $low陣列key最小值 $high 陣列key最大 ,搜尋 $k 值 。 $low - $high 搜尋的範圍
// 例如 0 - 5 在陣列 第一個元素到第六個元素 之間 搜尋 $k
function bin_sch($arr,$low,$high,$k){
    if($low <= $high ){
        $mid = intval(($low + $high)/2);
        if( $arr[$mid] == $k ){
            return $arr[$mid];
        }
        if( $k < $arr[$mid]){
           return bin_sch($arr,$low,$mid-1,$k);
        }
        if($k > $arr[$mid]){
            return bin_sch($arr,$mid+1,$high,$k);
        }
    }
    return '';
}

// 2、二分查詢
function bin_sch2($arr,$value)
{
    $low = 0 ;
    $max = count($arr) -1;
    $mid = ($low + $max)/2;
    while ($value != $arr[$mid]){

        // 搜尋值 大於 之間值
        if($value > $arr[$mid]){
            $mid = $mid + 1;
        }

        // 搜尋值 小於 之間值
        if($value < $arr[$mid]){
            $mid = $mid - 1;
        }

        // 防止死迴圈
        if($mid >= $max || $mid <= 0){
            // 沒有找到
            return -1;
        }
    }
    return $arr[$mid];
}