1. 程式人生 > >『PHP學習筆記』系列六:二分法查詢演算法

『PHP學習筆記』系列六:二分法查詢演算法

演算法原理:

  • 二分法查詢適用於資料量較大時,但是資料需要先提前排好順序。(必須是順序儲存的資料!)
  • 確定該陣列中間元素位置:intval(0+(count($arr)-1))/2))
  • 如果中間位置的元素值,與要查詢的值相等,則直接返回。
  • 如果中間位置的元素值,與要查詢的值不相等,則需要確定新的查詢區域,繼續二分法查詢。
  • 如果要查詢的值,大於中間值,則查詢區域為:從中間值下標+1,到陣列末尾。
  • 如果要查詢的值,小於中間值,則查詢區域為:從0到中間值下標-1。
  • 依次類推…………

程式碼實現:

<?php
//二分法查詢演算法查詢陣列中的值:注意【每次確定中間下標】
function order($search, $numbers) {
	$low = 0;//最小下標
	$high = count($numbers) - 1;//最大下標
	while ($low <= $high) {
        //求中間下標,並取整
		$mid = intval(($low + $high) / 2);
        //如果中間下標元素與目標元素一致,則退出迴圈
		if ($numbers[$mid] == $search) {
			return $mid;
		} else if ($numbers[$mid] < $search) {
            //如果中間下標元素小於目標元素,則目標元素在陣列後半部分,最小值下標變更為原中間下標+1
			$low = $mid + 1;
		} else if ($numbers[$mid] > $search) {
            //如果中間下標元素大於目標元素,則目標元素在陣列前半部分,最小值下標變更為原中間下標-1
			$high = $mid - 1;
		}
	}
}
//待查陣列為從小到大的順序,如果為從大到小,則更改判斷部分的比較運算子
$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
$search1 = 7;
echo "元素'{$search1}'的陣列下標為:" . order($search1, $arr1);
echo "<hr/>";
 ?>

執行結果: