实验6-3 二分查找
设计函数 int BinarySearch(int a[],int n,int key);
利用二分查找算法,在升序排列的数组a的前n个元素中查找值为key的数组元素的下标。如果数组a中存在整数key,则返回下标;否则返回-1。假设数组a中的元素互不相同。
输入与输出要求:
首先输入两个整数n,m,分别代表数组a中元素的个数与需要查找的整数的个数,n(0<n<=2000000)与m(0<m<=100000)。然后分别输入n个整数和m个整数,分别代表存放在数组中的数以及要查找的数。
输出m个整数,分别为要查找的数在数组a中的下标,如果数组a中不存在某个数,则输出-1。数与数之间用空格分开,注意第n个数后没有空格而是换行符。
函数接口定义:
函数原型如下:
int BinarySearch(int a[],int n,int key) ;
其中 a 、 n和 key 都是用户传入的参数。 a被查找的数组; n 是数组长度; key 是要查找的元素。如果找到,则返回该元素在数组中的下标,否则返回-1。
输入样例:
15
20
-293 -213 -23 0 1 5 11 23 56 67 87 273 999 2132 10000
-23 -99999 0 999 953 67 56 44 33 87 -293 23 11 273 -213 2132 10000 87654 1 5
输出样例:
2 -1 3 12 -1 9 8 -1 -1 10 0 7 6 11 1 13 14 -1 4 5
代码实现:
#include<stdio.h>
//函数功能:二分查找
//函数参数:分别为被查找的数组,数组长度,所查找的元素
//函数返回值:如果找到,则返回该元素在数组中的下标,否则返回-1
int BinarySearch(int a[],int n,int key) ;
int num[2000010] ;//数据量比较大,将该数组放在全局区
int main()
{
int n , m, i;
int key ;
scanf("%d%d",&n,&m);
for( i = 0 ; i < n ; i++ )
scanf("%d",&num[i]) ;
for( i = 0 ; i < m ; i++ )
{
scanf("%d",&key) ;
printf("%d",BinarySearch(num,n,key)) ;
if ( i != m - 1 ) printf(" ") ;
else printf("\n") ;
}
return 0 ;
}
int BinarySearch(int a[],int n,int key)
{
int low=0,high=n-1;
int mid=(low+high)/2;
while(low<=high&&a[mid]!=key)
{
if(key<a[mid])
{
high=mid-1;
}
if(key>a[mid])
{
low=mid+1;
}
mid=(low+high)/2;
}
if(low>high) return -1;
else return mid;
}