扭转有序数组 查找指定元素

扭转数组查找元素

面试题:
//扭转后的有序数组,找到指定的数,返回下标,找不到时返回-1
//样例输入:3,4,5,6,7,1,2 查找数字7
//样例输出:4
审题:有序,扭转,那么一部分是有序的,一部分是无序的
思路:二分查找,必须找到
关键点在于:
1.利用中间元素去判断,因为是已经有序的,
如果左侧小于它,而扭转后的元素一定是比start都小,基于这点可以判断左侧有序。右侧同理。
如果key又正好在这中间,则可以缩小范围;如果key不在这区域,那么在右侧
充分利用二分查找,先确定哪侧是有序
2.
如果元素在左侧,在判断的时候发现右侧有序,将重新设置last下标,逐步的缩小范围,最后得到元素所在点

#include<stdio.h>

int BinSearch(int *arr,int len,int key){
   int left=0;
   int right=len-1;
   int mid;
   while(left<=right){
       mid=(left+right)/2;
       if(arr[mid]==key){
         return mid;
       }
     if(arr[mid]>arr[left]){
       //如果左侧有序
         if(arr[mid]>key&&arr[left]<=key){
           right=mid-1;
         }
         else{
           //如果不存在有序的数组内,则到右侧找
           left=mid+1;
         }
     }
     //中间比左边小,左边无序,右边有序
     else if(arr[mid]<arr[left]){
       //如果key处于中间与右边之间
       if(arr[mid]<key&&arr[right]>=key){
         left=mid+1;
       }
       else{//否则不在右侧数组内,right=mid-1
         right=mid-1;
       }
     }
   }
  return -1;
}


int main()
{
  int arr[7]={3,4,5,6,7,1,2};
  int data=BinSearch(arr,7,7);
  printf("index is:%d ",data);
  return 0;
}

结果:
index is:4

猜你喜欢

转载自blog.csdn.net/tang_jin2015/article/details/80958090