一、二分查找(Binary Search)
核心思想:
- 前提:數組必須是 有序的(比如從小到大排列)。
- 目標:在數組中快速找到某個數(比如找
7
)。 - 方法:每次排除一半的數,就像猜數字游戲!
類比生活:
- 假設在一本詞典里找 “蘋果” 這個詞:
- 普通查找:從第1頁開始一頁一頁翻,直到找到 “蘋果”。
- 二分查找:
- 先翻到詞典中間(比如第500頁),發現是 “貓”。
- “蘋果” 在 “貓” 前面,排除第500頁及后面的所有頁。
- 再翻到剩下部分的中間(比如第250頁),發現是 “狗”。
- “蘋果” 在 “狗” 前面,排除第250頁及后面的所有頁。
- 重復這個過程,直到找到 “蘋果”。
代碼示例(Java):
int[] arr = {1, 3, 5, 7, 9, 11}; // 必須是有序數組
int target = 7; // 要找的數int left = 0;
int right = arr.length - 1;while (left <= right) {int mid = (left + right) / 2; // 中間位置if (arr[mid] == target) {System.out.println("找到啦!位置是:" + mid);break;} else if (arr[mid] < target) {left = mid + 1; // 目標在右邊,排除左邊一半} else {right = mid - 1; // 目標在左邊,排除右邊一半}
}
二、排序(Sorting)
核心思想:
- 目標:把數組中的數按順序排列(比如從小到大)。
- 方法:有很多種算法,比如冒泡排序、快速排序等。
類比生活:
- 假設有一疊試卷,分數分別是
70, 90, 50, 80
,想按分數從低到高排列:- 冒泡排序:
- 比較第1個和第2個分數(70和90),不交換。
- 比較第2個和第3個分數(90和50),交換,變成
70, 50, 90, 80
。 - 比較第3個和第4個分數(90和80),交換,變成
70, 50, 80, 90
。 - 第一趟結束,最大的數(90)已經在最后。
- 重復這個過程,直到所有數都排好。
- 冒泡排序:
代碼示例(Java - 冒泡排序):
int[] arr = {70, 90, 50, 80};for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 交換兩個數int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}
}// 排序后:[50, 70, 80, 90]
三、二分查找和排序的關系
- 二分查找必須在有序數組中進行!
- 如果數組無序,二分查找會失效。比如數組是
[3, 1, 5]
,用二分查找找5
可能找不到。
- 如果數組無序,二分查找會失效。比如數組是
- 排序是為了后續能使用二分查找!
- 如果需要頻繁查找數組中的元素,先排序一次,之后就可以用二分查找快速找到元素。
四、常見誤區
- “二分查找排序” 不是一種排序算法!
- 二分查找是查找算法,排序是排序算法,它們是兩回事。
- 排序算法有很多種,二分查找只是查找的優化!
- 不要把二分查找和排序混為一談。
五、簡單練習
- 手寫二分查找:在有序數組
[2, 4, 6, 8, 10]
中找8
的位置。 - 手寫冒泡排序:將數組
[5, 3, 8, 4, 2]
從小到大排序。
如果有疑問,隨時問我! 😊