/*
48.微软:
一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}
是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。
方法1:
就是找到移位的点,然后移动之后,恢复递减序列,二分查找
方法2:
任意将这个数组从中间分开,分成两个数组,则至少有一个数组单调递减,
另一个数组则可以由递减数组左移若干位得到:
首先需要查找的数在哪一个分区里?判断哪一个分区是单调递减的分区,
可以比较arr[left]和arr[mid]
如果是大于等于,则左分区是单调递减,否则是右分区;
再通过判断要查找的值是否夹在递减分区中间来最终确定选择哪一个分区。
*/
#include<iostream>
#include<stdio.h>
using namespace std;
int search(int a[],int num,int left,int right)
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]==num)
return mid;
else
{
if(a[left]>=a[mid])//左分区单调递减,处理是否在左边
{
if(num<=a[left]&&num>a[mid])
right=mid-1;//加减1 看上面的比较是等于号
else
left=mid+1;
}
else//右分区单调递减
{
if(num<a[mid]&&num>=a[right])
left=mid+1;
else
right=mid-1;
}
}
}
return -1;
}
int main()
{
int ans,k;
int a[]={4,3,2,1,22,19,15,14,13,8,6,5};
while(1)
{
printf("请输入要查找的数(-1结束):");
scanf("%d",&k);
if(k==-1) break;
ans=search(a,k,0,sizeof(a)/sizeof(int)-1);
if(ans==-1)
printf("%d不再查找的序列当中\n\n",k);
else
printf("要查找的数:%d 在第%d个位置\n\n",k,ans+1);
}
return 0;
}
48 一个数组是由一个递减数列左移若干位形成的,然后查找某一个数
最新推荐文章于 2024-07-30 17:41:43 发布