折半查找

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;  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值