#include <stdio.h>
#define print_seek_result(key, index) \
{printf("Found %d at position %d\n", key, index);}
#define ARR_SIZE(arr) sizeof(arr)/sizeof(arr[0])
#define KEY_NOT_FOUND -1
int binary_search(int arr[], int low, int high, int num)
{
if (low>=high && arr[low]!=num)
return KEY_NOT_FOUND;
int mid = (low+high)/2;
if (arr[mid] == num)
return mid;
else if (arr[mid] < num)
low = mid+1;
else
high = mid-1;
return binary_search(arr, low, high, num);
}
int binary_search_while(int arr[], int low, int high, int num)
{
while (low<=high)
{
int mid = (low+high)/2;
if (num > arr[mid])
low = mid+1;
else if (num < arr[mid])
high = mid-1;
else
return mid;
}
return KEY_NOT_FOUND;
}
void main()
{
int arr_sort[] = {1, 2, 4, 5, 8, 9, 10, 13, 15, 17, 18, 23, 33, 36, 47, 55};
int len = ARR_SIZE(arr_sort);
int low = 0;
int high = len-1;
int key = 0;
int index = 0;
key = 0;
index = binary_search(arr_sort, low, high, key);
print_seek_result(key, index);
key = 6;
index = binary_search_while(arr_sort, low, high, key);
print_seek_result(key, index);
key = 15;
index = binary_search(arr_sort, low, high, key);
print_seek_result(key, index);
key = 47;
index = binary_search_while(arr_sort, low, high, key);
print_seek_result(key, index);
key = 50;
index = binary_search_while(arr_sort, low, high, key);
print_seek_result(key, index);
key = 60;
index = binary_search(arr_sort, low, high, key);
print_seek_result(key, index);
}
时间复杂度计算:
假设 序列长度为 n
n / 2 = A1;
A1 / 2 = A2;
....
Am/2 = 1;
即 n / 2^m = 1; 从而 n = 2^m, m = logn
复杂度为O(logn)
参考: