首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言二分搜尋法實作與常見錯誤分析

     編輯:關於C語言

C 語言二分搜尋法實作與常見錯誤分析

正確實作

#include <stdio.h>

int binary_search(const int arr[], int len, int key) {
    int left = 0, right = len - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2; // 避免溢位
        if (key == arr[mid]) return mid;
        else if (key > arr[mid]) left = mid + 1;
        else right = mid - 1;
    }
    return -1; // 未找到
}

int main() {
    int arr[] = {1, 3, 4, 5, 6, 7, 9, 13, 15, 36};
    int len = sizeof(arr) / sizeof(arr[0]);
    int key;
    printf("請輸入要查找的數: ");
    scanf("%d", &key);
    int pos = binary_search(arr, len, key);
    if (pos != -1)
        printf("找到 %d,位置索引 %d (第 %d 個)\n", key, pos, pos+1);
    else
        printf("不存在\n");
    return 0;
}

常見錯誤與修正

錯誤代碼問題修正
if (left = right)使用賦值 = 而非比較 ==改為 if (left > right) 或直接檢查返回值
mid = (left + right) / 2大陣列時 left+right 可能溢位用 left + (right-left)/2
陣列未排序二分搜尋前提是有序陣列確保資料已排序
傳入長度錯誤用 sizeof(arr) 而非元素個數sizeof(arr)/sizeof(arr[0])

遞迴版本

int binary_search_rec(const int arr[], int left, int right, int key) {
    if (left > right) return -1;
    int mid = left + (right - left) / 2;
    if (key == arr[mid]) return mid;
    if (key > arr[mid]) return binary_search_rec(arr, mid+1, right, key);
    return binary_search_rec(arr, left, mid-1, key);
}

迭代版本因無函數呼叫開銷,效能略優於遞迴,建議實務上使用迭代。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved