binary search

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



1. 实现 - C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 二分查找
// 注意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,每次查找后长度减半

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

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