折半查找法在有序数值中寻找某数

任务描述

本关任务: 假设有若干个由大到小排序的数已经顺序存放在一个数组中,现输入一个数x,请用折半查找法找出该数是数组中哪个元素的值。找到则输出数组元素的下标值;若该数不在数组中,则输出“无此数”的提示。

相关知识

为了完成本关任务,你需要掌握:

折半查找算法

折半查找算法

折半查找法是效率较高的一种查找方法。其基本思想是:设查找数据的范围下限为l=1,上限为h=5,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。

编程要求

假设有若干个由大到小排序的数已经顺序存放在一个数组中: 1.函数实现折半查找。函数原型为: int BinSearch(int arr[],int len,int key) //在长度是len的数组arr中寻找关键字key 2.主调函数实现: (1)输入一个数x,调用折半查找函数寻找该数; (2)若该数在数组中,输出该数在数组中的位置值(数组下标+1); (3)若该数不在数组中,则输出"无此数"的提示。

测试说明

平台会对你编写的代码进行测试: 假设有定义和初始化如下: int arr[]={11,10,9,8,7,6,5,4,3,2,1}; 测试输入:3 预期输出:3的位置是9

测试输入:22 预期输出:没找到22

#include<stdio.h>
#define NUM 11

int a[]={1,2,3,4,5,6,7,8,9,10,11};
int BinarySearch(int a[],int n,int key)
{
    int low,high,mid;
    low=0;
    high=n-1;
    while(low<=high)
    {
        mid=(low+high)/2;   
        if(a[mid]==key)     
            return mid;
        else if(a[mid]>key)         
            high=mid-1;
        else
            low=mid+1;
    }
    return -1;      //查找失败返回-1
}

int main()
{
    int key,result;
    scanf("%d",&key);
    result=BinarySearch(a,NUM,key);
    if(result>=0)
        printf("%d的位置是%d\n",key,12-(result+1));
    else
        printf("没找到%d\n",key);
    return 0;

}

作者码字不易,给个赞支持一下吧。

猜你喜欢

转载自blog.csdn.net/qq_46069852/article/details/120983898
今日推荐