分治算法二:二分查找

一、算法说明

(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].
", key);
        while(1);
        return 0;
    }
    printf("binarySearch result: the key[%d] position is [%d] = %d
", key, ret);
    while (1);
    return 0;
}

测试结果:

原文地址:https://www.cnblogs.com/HZL2017/p/14333134.html