二分搜索 (已序)

一.题目

Description 编写Search_Bin函数,实现在一个递增有序数组ST中采用折半查找法确定元素位置的算法.

输入格式
第一行:元素个数n
第二行:依次输入n个元素的值(有序)
第三行:输入要查找的关键字key的值

输出格式
输出分两种情形:
1.如果key值存在,则输出其在表中的位置x(表位置从0开始),格式为The element position is x.
2.如果key值不存在输出:”The element is not exist.”

输入样例
6
1 3 5 7 9 10
5

输出样例
The element position is 2.**
`

二..思路分析
二分,通过每一次的mid 来确认 当前数组内元素是不是要找的那个,由于是依序的,所以每一次的操作,都能过滤掉当前长度的一半(不是总长度!),进行多次,把序列都找完,或者是 找到那个元素 ,mid 作为中间位置的值,每次查找完,重调一下lett, 和 right ,重设mid ,进行下一轮查找。

三.代码实现

first :while 实现

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstdlib>

using namespace std;

int a[1000];

int binsearch(int *a,int left,int right,int e)
{
    int mid;
    while(left <= right)  // while 的判断很重要,当 left > right 时,说明已经超出数列了
    {
        mid = (left + right)/2;  //初始mid
        if(a[mid] > e)
        {
            right = mid -1;  // 要找的元素小于 当前的中间位置的值,则令区域变成(left,mid-1)
        }
        else if(a[mid]<e)
        {
            left = mid +1;  // 要找的元素大于 当前的中间位置的值,则令区域变成(mid+1,right)
        }
        else  //找到了
        {
            return printf("The element position is %d.",mid);
        }
    }
    return printf("The element is not exist.");
}
int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }

    int e;
    scanf("%d",&e);

    binsearch(a,0,n-1,e);
}

second : 递归实现

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstdlib>

using namespace std;

//int a[10] = {0,1,2,3,4,5,6,78,89,90};
int a[1000];

int bisear(int *a,int left,int right,int e)
{
    if(left > right)    return printf("The element is not exist."); //边界判断,以此跳出递归

    int mid = (left + right )/2;  //初始mid

    if( a[mid] > e)
    {
        bisear(a,left,mid-1,e); // 要找的元素小于 当前的中间位置的值,则令区域变成(left,mid-1)
    }
    else if(a[mid]<e)
    {
        bisear(a,mid+1,right,e);// 要找的元素大于 当前的中间位置的值,则令区域变成(mid+1,right)
    }
    else   // 找到了
    {
        return printf("The element position is %d.",mid); 
    }

}

int main()
{
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }

    int e;
    scanf("%d",&e);

    bisear(a,0,n-1,e);

    //bisear(a,0,9,100);
    return 0;
}

四.总结反思
关于递归,始终还是不太熟练,操作起来也思考了比较久,如果用while 方法来引导,作出递归 就会比较简单一点,不过如果能用while解决的话,递归也就没什么必要了,做一下递归,主要是练习一下自己的思维,毕竟递归还是很常用的。
在C++里面好像是有自带的库函数来实现 二分搜索的,但是还不懂C++,也就不眼高手低了,还有主要还是想锻炼一下自己的打码思维。在已经熟练一些算法之后,以后得去看看C++提供的便利的函数,来简化自己的工作量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值