zoukankan      html  css  js  c++  java
  • 改写二分算法

    改写二分算法

    题目描述:

    设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

    二分算法基本思想:

    将n个元素分成个数大致相同的来两半,取中间值 a【n/2】与要找的数 x 进行比较。

    如果数组的中间值就是x,算法终止;

    如果数组的中间值大于x,则只要在数组a的左半部分继续搜索x;

    如果数组的中间值小于x,则只要在数组a的右半部分继续搜索x。

    代码如下:

    #include<iostream>
    using namespace std;
    void s(int a[],int n,int x,int left,int right)
    {
        int mid;
        while(left<=right)
        {
            mid=(left+right)/2;
            if(x==a[mid])
            {
                cout<<mid<<endl;//如果要找的x在数组内且正好是中间的那个数
                return;
            }
            if(x>a[mid])  left=mid+1;//要找的x大于中间值
            if(x<a[mid])  right=mid-1;//要找的x小于中间值
        }
        if(x<a[0])  cout<<-1<<" "<<0<<endl;//要找的x不在数组内,且小于最小值
        if(x>a[n-1])  cout<<n-1<<" "<<n<<endl;//要找的x不在数组内,且大于最大值
        if((x<a[mid])&&(x>a[0]))  cout<<mid-1<<" "<<mid<<endl;//要找的x在左半边数组中(在或不在)
        else if((x>a[mid])&&(x<a[n-1]))  cout<<mid<<" "<<mid+1<<endl;//要找的x在右半边数组中(在或不在)
    }
    int main()
    {
        int n,x,*a;
        cin>>n;
        cin>>x;
        a=new int [n];
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        s(a,n,x,0,n-1);
        return 0;
    }
    

      

      

    实例运行结果截图:

    实例1

    实例2

    实例3

     

  • 相关阅读:
    《构建之法》前三章读后感--软件工程
    复利计算--web版--总结--软件工程
    利率计算v2.0--web版--软件工程
    <更新日期03-31-2016> 复利计算5.0 <已改进>
    0302随笔
    有限自动机的构造与识别
    评论
    C语言文法
    词法分析 after Coding
    词法分析
  • 原文地址:https://www.cnblogs.com/canneddream/p/14223582.html
Copyright © 2011-2022 走看看