C++ 二分查找(折半查找、Binary Search)算法

思路:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;

             否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一

            子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为

            止,此时查找不成功。

一、非递归实现:

#include <iostream>

// 二分查找:如果查找到,就返回在数组中的下标,否则返回-1
int searchBin(int arr[], int len, int x) {
    int low, high, mid;
    
    low = 0;
    high = len - 1;
    while(low <= high) {
        mid = (low + high) / 2;
        if(x == arr[mid])
            return mid;
        else if(x < arr[mid])
            high = mid - 1;
        else
            low = mid + 1;
    }
    return -1;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化数组
    int len, x, loc; // len存储数组的实际长度,x要查找的数, loc位置
    
    len = sizeof(arr) / sizeof(arr[0]); // 整个数组长度
    // 获取数组的实际长度:while(arr[i] != '\0') {count++}
    std::cout << "请输入要查找的数:\n";
    while(std::cin >> x) {
        loc = searchBin(arr, len, x); // 调用二分查找函数
        if(loc >= 0)
            std::cout << "在数组中找到了" << x << ",在数组中是第" << (loc + 1) << "个。\n";
        else
            std::cout << "在数组中找不到" << x << std::endl;
        std::cout << "请继续输入要查找的数:\n";
    }
    return 0;
}

二、递归实现:

#include <iostream>

// 二分法:递归
int searchBin(int arr[], int x, int low, int high) {
    int mid;
    
    if(low > high)
        return -1;
    mid = (low + high) / 2;
    if(x == arr[mid])
        return mid;
    else if(x < arr[mid])
        return searchBin(arr, x, low, mid-1);
    else
        return searchBin(arr, x, mid+1, high);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化数组
    int len, x, loc; // len存储数组的实际长度,x要查找的数, loc位置

    len = sizeof(arr) / sizeof(arr[0]); // 整个数组长度
    std::cout << "请输入要查找的数:\n";
    while(std::cin >> x) {
        loc = searchBin(arr, x, 0, len-1); // 调用二分查找函数
        if(loc >= 0)
            std::cout << "在数组中找到了" << x << ",在数组中是第" << (loc + 1) << "个。\n";
        else
            std::cout << "在数组中找不到" << x << std::endl;
        std::cout << "请继续输入要查找的数:\n";
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/chuanzhouxiao/article/details/85487284