试题 算法提高 二分法查找数组元素
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述:
用递归函数实现二分法查找数组元素。
补充:要求给定数组采用如下代码定义
int data[200];
for (i=0; i<200; i++)
data[i]=4*i+6;
输入格式:
输入一个待查找的整数(该整数一定在数组data中)。
输出格式:
该整数在数组中的指标。
样例输入:
一个满足题目要求的输入范例。
例1:
262
例2:
438
例3:
774
样例输出:
与上面的样例输入对应的输出。
例1:
64
例2:
108
例3:
192
数据规模和约定:
输入数据中每一个数的范围。
输入数据必须满足4*i+6,i=0,1,2,3,…,198,199。
我的代码如下:
#include <iostream>
using namespace std;
int find(int a[], int key, int low, int high)
{
int mid = (low + high) / 2; // 范围的中间值,
if (low > high) // 范围出错,直接退出
return -1;
if (key == a[mid]) // 如果要找的值就是在二分处,直接输出 该序号
return mid;
else if (key < a[mid])
return find(a, key, low, mid - 1); // 没找的话,范围最大值就为mid-1
else
return find(a, key, mid + 1, high); // 没找的话,就从mid-1开始找
}
int main()
{
int data[200];
int n, i;
for (i = 0; i < 200; i++) // 初始化数组
{
data[i] = 4 * i +6;
}
cin >> n;
cout << find(data, n, 0, 200); // 输出递归查询后的结果
return 0;
}
具体解析代码区有注释,应该可以看懂,比较简单。
二分法查找
适用范围:二分法查找适用于数据量较大时,但是数据需要先排好顺序。
主要思想:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K
(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。
时间复杂度为:O(log2n)。
图解
(图解来源于网络,如侵删)