二分搜尋法

更新於 發佈於 閱讀時間約 3 分鐘

前導

二分搜尋法(Binary Search)是一種 高效的搜尋演算法,適用於 已排序 的資料結構。 它的核心思想是 每次將搜尋範圍減半,直到找到目標值或範圍縮小到無法繼續搜尋。

演算法步驟

  1. 確認資料已排序(若未排序,需先排序)。
  2. 設定 左邊界 (low) 為 0,右邊界 (high) 為陣列長度 - 1
  3. 計算中間索引 (mid)
raw-image
  1. 比較 arr[mid]target
      • arr[mid] == target,則返回索引 mid(找到目標)。
      • arr[mid] > target,則 high = mid - 1(縮小到左半區間)。
      • arr[mid] < target,則 low = mid + 1(縮小到右半區間)。
  1. 重複第三步驟和第四步驟。
  2. low > high,表示目標值 不存在,返回 -1

程式碼

#include <stdio.h>

int binarySearch(int arr[], int size, int target) {
int low = 0, high = size - 1;

while (low <= high) {
int mid = low + (high - low) / 2;
printf("low = %d, high = %d, mid = %d, arr[mid] = %d\n", low, high, mid, arr[mid]);

if (arr[mid] == target) {
return mid; // 找到目標,返回索引
}
if (arr[mid] < target) {
low = mid + 1; // 搜尋右半部
} else {
high = mid - 1; // 搜尋左半部
}
}
return -1; // 找不到
}

int main() {
int arr[] = {2, 5, 8, 12, 16, 23, 38, 45, 56, 72}; // 已排序數列
int size = sizeof(arr) / sizeof(arr[0]);
int target = 23;

int result = binarySearch(arr, size, target);
if (result != -1) {
printf("找到 %d,索引位置為 %d\n", target, result);
} else {
printf("未找到 %d\n", target);
}

return 0;
}
  • 與 循序搜尋法 相比,二分搜尋法的效率大幅提升。
avatar-img
電資鼠 - 您的學習好夥伴
8會員
200內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
留言
avatar-img
留言分享你的想法!
雙向串列 (Double Linked List, DLL) 是一種鏈結資料結構,本章節將以完整註解,搭配關鍵操作地方的圖示輔助學習,讓你輕鬆搞懂複雜觀念,並透過C語言實作。
環狀鏈結串列是一種特殊的鏈結串列,其最後一個節點的指標指向第一個節點,而非 NULL,形成一個循環結構。本章節將以豐富圖示,引導讀者了解環狀串列在各種地方執行插入和刪除節點的步驟,輕鬆學會資工科的專業知識-環狀串列。
雙向串列 (Double Linked List, DLL) 是一種鏈結資料結構,本章節將以完整註解,搭配關鍵操作地方的圖示輔助學習,讓你輕鬆搞懂複雜觀念,並透過C語言實作。
環狀鏈結串列是一種特殊的鏈結串列,其最後一個節點的指標指向第一個節點,而非 NULL,形成一個循環結構。本章節將以豐富圖示,引導讀者了解環狀串列在各種地方執行插入和刪除節點的步驟,輕鬆學會資工科的專業知識-環狀串列。