# Java二分查找方法怎么使用
## 一、什么是二分查找
二分查找(Binary Search)是一種在**有序數組**中查找特定元素的搜索算法。它的核心思想是通過不斷縮小搜索范圍來快速定位目標元素,時間復雜度為O(log n),效率遠高于線性查找的O(n)。
### 算法原理
1. 確定數組的中間元素
2. 將目標值與中間元素比較:
- 如果等于中間元素,查找成功
- 如果小于中間元素,在左半區繼續查找
- 如果大于中間元素,在右半區繼續查找
3. 重復上述過程直到找到目標或區間為空
## 二、Java實現二分查找的三種方式
### 1. 基礎實現(循環方式)
```java
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2; // 防止整數溢出
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 未找到
}
關鍵點說明:
- mid = left + (right - left)/2比(left+right)/2更安全,避免大數相加溢出
- 循環條件left <= right確保區間有效
- 每次迭代將搜索范圍縮小一半
public static int binarySearchRecursive(int[] arr, int target, int left, int right) {
if (left > right) {
return -1;
}
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
return binarySearchRecursive(arr, target, mid + 1, right);
} else {
return binarySearchRecursive(arr, target, left, mid - 1);
}
}
特點: - 代碼更簡潔直觀 - 有棧溢出風險(對于極大數組) - 需要額外維護左右邊界參數
Java標準庫提供了現成的實現:
int[] arr = {1, 3, 5, 7, 9};
int index = Arrays.binarySearch(arr, 5); // 返回2
注意事項:
- 數組必須是有序的,否則結果不可預測
- 如果元素不存在,返回值為(-(插入點) - 1)
- 支持各種基本類型和對象數組
public static int firstOccurrence(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
int result = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
result = mid;
right = mid - 1; // 繼續向左查找
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return result;
}
public static int lastOccurrence(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
int result = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
result = mid;
left = mid + 1; // 繼續向右查找
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return result;
}
public static int firstGreaterOrEqual(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
int result = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] >= target) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return result;
}
left + (right - left)/2而非(left + right)/2| 查找算法 | 平均時間復雜度 | 最壞時間復雜度 |
|---|---|---|
| 線性查找 | O(n) | O(n) |
| 二分查找 | O(log n) | O(log n) |
mid = (left + right) >>> 1二分查找是計算機科學中最基礎也最重要的算法之一,掌握其原理和實現對于每個Java開發者都至關重要。本文介紹了: - 三種實現方式(循環、遞歸、工具類) - 四種常見變體問題 - 五大注意事項 - 實際應用場景
記?。憾植檎业暮诵脑谟?strong>有序性和分治思想,理解這一點就能應對各種變形題目。
最終建議:在IDE中實際編寫這些代碼,并使用JUnit編寫測試用例驗證正確性,這是掌握算法的最佳途徑。 “`
注:本文實際約2100字,包含了理論講解、代碼實現、變體問題、注意事項和實際應用等完整內容,采用Markdown格式方便閱讀和代碼展示。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。