王道机试例题3.5 查找

王道机试例题3.5 查找

题目描述

输入数组长度 n 输入数组 a[1…n] 输入查找个数m 输入查找数字b[1…m] 输出 YES or NO 查找有则YES 否则NO 。

输入描述:

输入有多组数据。
每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。

输出描述:

如果在n个数组中输出YES否则输出NO。

示例1

输入

5
1 5 2 4 3
3
2 5 6

输出

YES
YES
NO

代码

#include <iostream>
#include<stdio.h>

const int maxn = 100;
int arr1[maxn];
int arr2[maxn];

bool search(int x,int n) {    //二分查找
    int left=0, right=n-1, mid;
    mid = (left + right) / 2;
    while (left <= right) {
        if (arr1[mid] == x) {
            return true;
        }
        else if (arr1[mid] > x) {
            right = mid - 1;
            mid = (left + right) / 2;
        }
        else {
            left = mid + 1;
            mid = (left + right) / 2;
        }
    }
    return false;
}

int main()
{
    int n,m;
    while (scanf("%d", &n) != EOF) {
        for (int i = 0; i < n; i++) {
            scanf("%d", &arr1[i]);
        }
        scanf("%d", &m);
        for (int i = 0; i < m; i++) {
            scanf("%d", &arr2[i]);
        }
        //多次查找,二分查找的性能会优于线性查找
        //排序 升序
        for (int i = 0; i < n; i++) {
            for (int j = n - 1; j > i; j--) {
                if (arr1[j] < arr1[j - 1]) {
                    int temp = arr1[j];
                    arr1[j] = arr1[j - 1];
                    arr1[j - 1] = temp;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            if (search(arr2[i], n)) {
                printf("YES\n");
            }
            else {
                printf("NO\n");
            }
        }
    }
}

注意

int mid=(left+right)/2。通常情况下,这是对的,也很容易理解。
不过,如果left和right非常接近整形最大值,这时求中间值就会出现溢出问题,因此要用代码int mid=left+(right-left)/2代替。二者功能等价,并且后者不会出现溢出现象。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页