二分法和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).