扭转数组查找元素
面试题:
//扭转后的有序数组,找到指定的数,返回下标,找不到时返回-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