分治算法二:二分查找
一、算法说明
(1)检测有序序列的中间值与指定元素是否相等,若相等则返回对应下标;
(2)若有序序列的中间元素大于指定元素,则将该问题分解成在左半部分查找指定元素,进行递归处理;
(3)若有序序列的中间元素小于指定元素,则将该问题分解成在右半部分查找指定元素,进行递归处理;
(4)递归出口条件有两种:找到指定元素,返回下标;入参的下标相等,表明无法找到指定元素
二、代码实现
/*
* description: 在有序序列中,查找指定元素的下标,若存在则给出第一个这样元素的下标,否则输出不存在
* input: 有序序列指针array,序列起始下标p,序列终止下标r,指定元素key
* outut: 指定元素下标,或者-1(未找到)
*/
int binarySearch(int *array, int p, int r, int key)
{
int middle = (p + r) / 2;
// 递归出口
if (p > r) {
return -1;
}
if (array[middle] == key) {
return middle;
}
// 递归过程
if (array[middle] > key) {
// key 在左侧
binarySearch(array, p, middle - 1, key);
} else {
// key 在右侧
binarySearch(array, middle + 1, r, key);
}
}
三、测试结果
测试代码:
int main(void)
{
int array[ARRAY_SIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int ret = -1;
int key = 11;
ret = binarySearch(array, 0, ARRAY_SIZE - 1, key);
if (ret < 0) {
printf("can not search the key[%d].\n", key);
while(1);
return 0;
}
printf("binarySearch result: the key[%d] position is [%d] = %d\n", key, ret);
while (1);
return 0;
}
测试结果: