改写二分算法

 

改写二分算法

 

题目描述:

设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

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-01-02 18:57  CannedDream  阅读(111)  评论(0编辑  收藏  举报