『PHP學習筆記』系列六:二分法查詢演算法
阿新 • • 發佈:2018-11-17
演算法原理:
- 二分法查詢適用於資料量較大時,但是資料需要先提前排好順序。(必須是順序儲存的資料!)
- 確定該陣列中間元素位置: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/>"; ?>