• 分治算法二:二分查找


    一、算法说明

    (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;
    }
    
    

    测试结果:

  • 相关阅读:
    Vs 开发时无法断点问题
    VS启动调试速度异常的缓慢问题
    vs2017 调试时 浏览器关闭不想中断调试
    聚簇索引和非聚簇索引
    java实现阿里云短信服务发送验证码
    mysql定时器
    token,加密,签名
    Redis更新缓存同步数据库的理解
    Token
    解决哈希冲突的方法
  • 原文地址:https://www.cnblogs.com/HZL2017/p/14333134.html
Copyright © 2020-2023  润新知