#include<stdio.h>
//旋轉數組沒有相等的數 [6,7,8,9,1,2,3,4,5]
int Find_min(int array[],int length)
{
int ptrnode1,ptrnode2,midnode;
ptrnode1=0;
ptrnode2=length-1;
midnode=ptrnode1;
while(array[ptrnode1]>=array[ptrnode2])
{
if(ptrnode2-ptrnode1==1)
{
midnode=ptrnode2;
break;
}
midnode=(ptrnode1+ptrnode2)>>1;
if(array[ptrnode1]<=array[midnode])
{
ptrnode1=midnode;
}
else if(array[ptrnode2]>=array[midnode])
{
ptrnode2=midnode;
}
}
return array[midnode];
}
//旋轉數組存在相等的數 [1 0 1 1 1],[1 1 1 1 0 1 1]
int Ord(int array[],int p1,int p2)
{
int i=p1;
int key=array[p1];
for(;i<p2;i++)
{
if(key>array[i])
key=array[i];
}
return key;
}
int Find_min_up(int array[],int length)
{
int ptrnode1,ptrnode2,midnode;
ptrnode1=0;
ptrnode2=length-1;
midnode=ptrnode1;
while(array[ptrnode1]>=array[ptrnode2])
{
if(ptrnode2-ptrnode1==1)
{
midnode=ptrnode2;
break;
}
midnode=(ptrnode1+ptrnode2)>>1;
if((array[ptrnode1]==array[ptrnode2])&&
array[ptrnode1]==array[midnode])
{
return Ord(array,ptrnode1,ptrnode2);
}
if(array[ptrnode1]<=array[midnode])
{
ptrnode1=midnode;
}
else if(array[ptrnode2]>=array[midnode])
{
ptrnode2=midnode;
}
}
return array[midnode];
}
void main()
{
int array[]={1,0,1,1,1};
printf("%d\n",Find_min_up(array,5));
}
//查找旋轉數組中最小值,時間複雜度爲O(log(n))