一:折半查找概念
????????折半查找(也稱為二分查找)是一種在有序數組中查找某一特定元素的搜索算法。搜索過程從數組的中間元素開始,如果中間元素正好是目標值,則搜索過程結束;如果目標值大于或小于中間元素,則在數組大于或小于中間元素的那一半中查找,而且同樣在那一半的中間元素開始比較。如果在某一步驟數組為空,則代表找不到。這種搜索算法每一次比較都使搜索范圍縮小一半。
二:折半查找的步驟
前提條件:數組必須是有序的。
確定搜索范圍:初始化搜索范圍的左邊界?
left
?為數組的第一個元素索引,右邊界?right
?為數組的最后一個元素索引。計算中間位置:計算中間位置?
mid
,通常使用?(left + right) / 2
?的方式,為了避免整數溢出,也可以寫作?left + (right - left) / 2
。比較中間元素:將目標值?
target
?與中間位置?mid
?對應的元素進行比較。
- 如果相等,則搜索成功,返回?
mid
。- 如果目標值小于中間元素,則更新右邊界?
right = mid - 1
,在左半部分繼續查找。- 如果目標值大于中間元素,則更新左邊界?
left = mid + 1
,在右半部分繼續查找。循環搜索:重復步驟 3 和 4,直到找到目標值或者搜索范圍為空(即?
left > right
)。搜索失敗:如果搜索范圍為空,則目標值不在數組中,返回 -1 或其他表示未找到的值。
三.折半查找案例分析
例如:在數組array = {4, 5, 6, 7, 9, 12, 18, 23}中查找9,其代碼實現如下
public class BinarySearch {// 聲明一個靜態變量來記錄比較次數public static int comparisonCount = 0;public static int binarySearch(int[] array, int target) {if (array == null || array.length == 0) {comparisonCount = 0; // 數組為空,設置比較次數為0return -1; // 數組為空,返回-1表示未找到}int left = 0;int right = array.length - 1;while (left <= right) {comparisonCount++; // 每次比較時增加計數int mid = left + (right - left) / 2; // 防止溢出if (array[mid] == target) {return mid; // 找到目標,返回其索引} else if (array[mid] < target) {left = mid + 1; // 在右半部分繼續查找} else {right = mid - 1; // 在左半部分繼續查找}}return -1; // 沒有找到目標,返回-1}public static void main(String[] args) {int[] array = {4, 5, 6, 7, 9, 12, 18, 23};int target = 9;int result = binarySearch(array, target);if (result != -1) {System.out.println("元素 " + target + " 在數組中的索引為: " + result + " 查找的次數:" +comparisonCount);} else {System.out.println("元素 " + target + " 不在數組中" + "查找的次數" +comparisonCount);}}
?結果如下:
四:折半查找的圖解
五:折半查找的時間復雜度
????????折半查找的時間復雜度為 O(log n),可以考慮哈希表等其他數據結構提高效率