Binary Search — Tìm kiếm nhị phân

Tìm kiếm trên mảng đã sắp xếp bằng cách chia đôi không gian tìm kiếm sau mỗi bước — hiệu quả gấp hàng chục lần Linear Search.

Ý tưởng

Thay vì kiểm tra từng phần tử như Linear Search, Binary Search chia đôi mảng mỗi bước: so sánh target với phần tử giữa (mid). Nếu target nhỏ hơn → tìm nửa trái; lớn hơn → tìm nửa phải; bằng → tìm thấy!

💡
Ví dụ trực quan: Mảng 1.000 phần tử — Linear Search cần tối đa 1.000 bước, Binary Search chỉ cần tối đa 10 bước (log₂ 1000 ≈ 10).

Thuật toán (lặp)

  1. Đặt lo = 0, hi = n - 1
  2. Trong khi lo ≤ hi: tính mid = (lo + hi) / 2
  3. Nếu a[mid] == target → trả về mid
  4. Nếu a[mid] < targetlo = mid + 1
  5. Nếu a[mid] > targethi = mid - 1
  6. Nếu thoát vòng lặp → không tìm thấy, trả về -1

Cài đặt bằng C

binary_search.c
#include <stdio.h>

/**
 * Binary Search trên mảng đã sắp xếp tăng dần
 * Trả về chỉ số của target, hoặc -1 nếu không tìm thấy
 */
int binarySearch(int a[], int n, int target) {
    int lo = 0, hi = n - 1;

    while (lo <= hi) {
        int mid = lo + (hi - lo) / 2;  // Tránh tràn số (overflow)

        if (a[mid] == target)
            return mid;           // Tìm thấy!
        else if (a[mid] < target)
            lo = mid + 1;          // Tìm nửa phải
        else
            hi = mid - 1;          // Tìm nửa trái
    }

    return -1;  // Không tìm thấy
}

int main() {
    int a[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91};
    int n      = sizeof(a) / sizeof(a[0]);
    int target = 23;

    int idx = binarySearch(a, n, target);

    if (idx != -1)
        printf("Tìm thấy %d tại chỉ số %d\n", target, idx);
    else
        printf("Không tìm thấy %d\n", target);

    return 0;
}
Lưu ý quan trọng: Dùng mid = lo + (hi - lo) / 2 thay vì (lo + hi) / 2 để tránh tràn số nguyên khi lo + hi vượt quá INT_MAX.

Demo tương tác

🔍 Minh họa Binary Search

Mảng (đã sort):
Tìm giá trị:
Nhập mảng đã sắp xếp và giá trị cần tìm, nhấn Tìm kiếm

Phân tích độ phức tạp

Trường hợpThời gianKhông gianGhi chú
Tốt nhấtO(1)O(1)Phần tử nằm đúng giữa
Trung bìnhO(log n)O(1)Cần chia đôi log₂n lần
Tệ nhấtO(log n)O(1)Phần tử không tồn tại

So sánh Linear vs Binary Search

Kích thước nLinear SearchBinary Search
1010 bước4 bước
100100 bước7 bước
1.0001.000 bước10 bước
1.000.0001.000.000 bước20 bước