1010: 折半查找的实现

题目描述
编写程序实现折半查找算法。

输入
第一行是查找表的长度n
第二行是查找表中的数据元素 ;
第三行是要查找的数据元素的关键字.

输出
查找成功返回位序,不成功返回-1 ,第二行为比较的次数。

样例输入

11
5 13 19 21 37 56 64 75 80 88 92
100

样例输出

-1
4
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MaxSize 1000
int num[MaxSize];
int ans=0;//比较次数
int Binserch(int num[],int n,int k)
{
    int mid,low=0,high=n-1;
    while(low<=high)
    {
        ans++;//比较次数加一
        mid=(low+high)/2;
        if(num[mid]==k)//找到,返回下标
        {
            return mid;
        }else
        if(k<num[mid])//k是小于中间数,则k是在中间数以左
        {
            high=mid-1;
        }else
        if(k>num[mid])//k是大于中间数,则k是在中间数以右
        {
            low=mid+1;
        }
    }
    return -1;//未找到返回-1
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&num[i]);
    }
    int k;
    scanf("%d",&k);
    printf("%d",Binserch(num,n,k));
    //查找算法参考教材318页
    printf("\n");
    printf("%d",ans);
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
折半查找(Binary Search)是一种高效的查找算法,也叫二分查找。它适用于有序序列的查找,通过每次将查找区间缩小一半,直到查找到目标元素或者区间为空为止。 以下是C++实现折半查找的代码: ```c++ #include <iostream> using namespace std; int binarySearch(int arr[], int left, int right, int target) { while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; // 没有找到目标元素 } int main() { int arr[] = {1, 2, 3, 4, 5, 6}; int n = sizeof(arr) / sizeof(arr[0]); int target = 4; int index = binarySearch(arr, 0, n - 1, target); if (index != -1) { cout << "目标元素在数组中的下标为:" << index << endl; } else { cout << "目标元素不在数组中!" << endl; } return 0; } ``` 在上述代码中,binarySearch函数接收四个参数:数组arr、查找区间的左右边界left和right、目标元素target。每次循环中,计算出中间位置mid,如果中间元素等于目标元素,返回mid;否则,如果中间元素小于目标元素,则在右半边查找,更新left为mid+1;否则,在左半边查找,更新right为mid-1。 在主函数中,定义一个有序数组arr和目标元素target,调用binarySearch函数进行查找。如果函数返回值不为-1,说明目标元素在数组中,输出目标元素在数组中的下标;否则,输出目标元素不在数组中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值