2017年北京理工大学研究生复试机试题:二分查找/折半查找

Problem Description

显示出如下数组中的所有元素,并使用二分查找法在数组中查找元素。
int a[] = {-90, -32, 12, 16, 24, 36, 45, 59, 98, 120};

Input

输入所要查找的元素。

Output

  1. 输出数组中的所有元素。
  2. 输出该元素的位置以及二分查找的比较次数。

Sample Input

24
120
6

Sample Output

-90 -32 12 16 24 36 45 59 98 1205个元素为24,比较次数为110个元素为120,比较次数为4
查找失败,比较次数为3

解题思路

  1. 直接默写二分查找代码模板,只不过需要记录比较次数。

经验总结

  1. 二分查找的while循环条件是left <= right,当left == right时,mid,left,right指向同一个元素,这个元素有可能为所要查找的元素。
  2. 只有left > right,即left和right错位,表示查找失败。

代码实现(C)

#include <stdio.h>

int a[] = {-90, -32, 12, 16, 24, 36, 45, 59, 98, 120};

// 二分查找代码
int binary_search(int left, int right, const int num, int *count) {
    count = 0;
    while (left <= right) {
        int mid = (left + right) / 2;
        count++;    // count记录比较次数
        if (a[mid] == num)
            return mid;
        else if (a[mid] < num)
            left = mid + 1;
        else
            right = mid - 1;
    }
    return -1;
}


int main() {
    int num;
    // 输出数组元素
    for (int i = 0; i < 10; ++i) {
        if (i < 9)
            printf("%d ", a[i]);
        else
            printf("%d\n", a[i]);
    }
    // 对输入元素进行查找及输出
    while (~scanf("%d", &num)) {
        int count;
        int pos = binary_search(0, 9, num, &count);
        if (pos >= 0)
            printf("第%d个元素为%d,比较次数为%d\n", pos + 1, num, count);
        else
            printf("查找失败,比较次数为%d\n", count);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值