给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次,编写代码找出数组中的某个元素

来源:互联网 发布:网络攻击的主要方法 编辑:程序博客网 时间:2024/04/29 20:36

public int search(int a[],int left,int right,int x)
{
int mid=(left+right)/2;
if(x==a[mid])
{
return mid;
}
if(right<left)
return -1;
/*左半边或右半边必有一边是按正常顺序排列,
* 找出是那一半边,然后利用按正常顺序排列的半边,确定该搜索哪一边
*/
if(a[left]<a[mid])//左半边为正常排序
{
if(x>=a[left]&&x<=a[mid])
{
return search(left,mid-1,x);//搜索左半边
}
else
{
return search(a,mid+1,right,x);//搜索右半边
}
}
else if(a[mid]<a[left])//右半边为正常排序
{
if(x>=a[mid]&&x<=a[right])
{
return search(a,mid+1,right,x);//搜索右半边
}
else
{
return search(a,left,mid-1,x);//搜索左半边
}
}
else if(a[left]==a[mid])//左半边都是重复元素
{
   if(a[mid]!=a[right])//若右边元素不同,则搜索那一边
   {
    return  search(a,mid+1,right,x);//搜索右半边
   }
   else//否则,两边都得搜索
   {
    int result=search(a,left,mid-1,x);//搜索左半边
    if(result==-1)
    {
    return search(a,mid+1,right,x);//搜索右半边
    }
    else
    {
    return result;
    }
   }
}
return -1;
}


0 0
原创粉丝点击