binary search

2020/07/05

二分法和c语言实现及时间复杂度分析

1. 实现 - C

// 二分查找
// 注意middle的下标和位于数组middle的值

#include <stdio.h>

int binary_search(int a[], int to_be_found, int len) {
    int l = 0;        // left index
    int r = len - 1;  // right index

    while (l <= r) {
        //int middle = (l + r) / 2; // find the middle number index
        int middle = l + (r - l) / 2; // find the middle number index
                                      // 避免溢出

        if (a[middle] == to_be_found)  // 刚好中间数就是我们要找的数
            return middle;
        if (a[middle] < to_be_found)   // 中间数 < 要找的数
            l = middle + 1;
        else
            r = middle - 1;
    }
    return -1;
}

int main(int argc, char *argv[])
{
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int len = sizeof(a) / sizeof(a[0]);  // calculate the array's length
    int res = binary_search(a, 4, len);
    if (res != -1)
        printf("Find out index = %d\n", res);
    else
        printf("No answer!\n");

    return 0;
}

2. 时间复杂度分析

假设数组长度为n,每次查找后长度减半

// 第一次 = n/2
// 第二次 = n/4
// ...
// 第k次 = n * (1/2)^k

最坏情况 = 数据长度为1时找到,即 n * (1/2)k = 1. 求解得k = log2(n).