【数据结构--折半查找】

折半查找(代码+测试)


折半查找(binary search)的基本思想是: 假设有序表按关键码升序(或降序)排列,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录,则在有序表的左(右)半区继续查找;若给定值大于中间记录,则在有序表的右(左)半区继续查找。 不断重复上述过程,直到查找成功,或查找区域无该记录,查找失败。

折半查找有两种实现方法,非递归算法和递归算法。
非递归算法

int BinSearch1(int* arr, int n, int k){
    //arr为待查找的有序数组,n为元素个数,k为待查找值
    int mid, left = 1, right = n;
    while(left <= right){
        mid = (left + right) / 2;//取中间记录
        if(k < arr[mid])
            right = mid - 1;
        else if(k > arr[mid])
            left = mid + 1;
        else return mid;
    }
    return 0;//数组元素下标是从1开始,因此返回0表示查找失败
}

递归算法

int a[11];
int BinSearch2(int left, int right, int k){
    if(left > right) return 0;
    else{
        int mid = (left + right) / 2;
        if(k < a[mid])
            return BinSearch2(left, mid - 1, k);
        else if(k > a[mid])
            return BinSearch2(mid + 1, right, k);
        else return mid;
    }
}

测试

int main(){
    int arr[11] = {0, 2, 5, 7, 9, 15, 16, 17, 23, 46, 52};
    for (int i = 0; i < 11; ++i)
        a[i] = arr[i];
    cout << "使用非递归查找9的下标:" << BinSearch1(arr, 11, 9) << endl;
    cout << "使用递归查找15的下标:" << BinSearch2(0, 11, 15) << endl;
    return 0;
}

输入输出
在这里插入图片描述

  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值