1、折半查找又称二分查找,它仅适用于有序表。
2、基本思路:在有序表中取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间的记录的关键字,则在中间记录的左半区域查找,若给定值小于中间记录的关键字,则在中间记录的右半区域查找。
3、
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low=1; //定义最低下标记录首位
high=n; //定义最高下标记录末位
while(low<=high)
{
mid=(low+high)/2; //折半
if(key<a[mid]) //若查找值比中值小
high=mid-1; //最高下标调整到中位下标小一位
else if(key>a[mid]) //若查找值比中值大
low=mid+1; //最低下标调整到比中值大一位
else
return mid; //若相等,说明中值就是要查找的位置
}
}
4、例:假如有一组记录{7,10,13,16,19,29,32,33,37,41,43},如果要查找值为32的元素。
设置元素7的位置的下标1为low,设置43的下标11为high,此时mid=(1+11)/2=6,而位置6的元素是29,比32要小,此时low向前移动一位。
5、例:在11个元素的有序表A【1,2…,11】中进行折半查找,查找元素A[11],则被比较的下标的元素分别为:
第一次,mid=[(1+11)/2]=6, 6比11小,low=mid+1=7 第二次,mid=[(7+11)/2]=9; 9比11小,low=mid+1=10, 第三次,mid=[(10+11)/2]=10, 10比11小,low=mid+1=11, 第四次,mid=[(11+11)/2]=11.
6、
答案:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, k, key, low, high, mid,a[1000];
scanf("%d %d",&n,&k);
for (int i = 0;i < n;i++) {
scanf("%d", &a[i]);
}
for (int i = 0;i < k;i++) {
scanf("%d", &key);
low = 0;
high = n;
while (low < high) {
mid = (low + high) / 2;
if (a[mid] < key)
low = mid + 1;
else
high = mid;
}
if (a[low] == key)
printf("%d ", low);
else
printf("-1 ");
}
puts("");
return 0;
}