E:\arithmetic\RotateArray
P66
O(lgn) 特殊情况下是O(n)
#include <stdio.h>
void rotateArray(int a[],int length);
int main(int argc, char *argv[])
{ //测试用例 正常; 只有1个元素;最小元素在开头;头尾和中间都是相等的元素 ;NULL
int a[] = {3,4,5,1,2};
rotateArray(a, sizeof(a)/sizeof(int));
int b[] = {1,1,1,1,0,1};
rotateArray(b, sizeof(b)/sizeof(int));
int c[] = {1,2,3,4};
rotateArray(c, sizeof(c)/sizeof(int));
int d[] = {1};
rotateArray(d, sizeof(d)/sizeof(int));
return 0;
}
void rotateArray(int a[],int length){
if(a == NULL){
printf("error! array should not be NULL");
return;
}
if(length == 1){
printf("find mix! %d\n", a[0]);
return;
}
int start, end, mid;
start = 0;
end = length-1;
while(a[start] >= a[end]){
if(end - start == 1){
printf("find mixx! %d\n", a[end]);
return;
}
mid = (start+end)/2;
if(a[mid] > a[start]){
start = mid;
}
else if(a[mid] < a[start]){
end = mid;
}
else{
if( (a[mid] == a[start])&&(a[mid] == a[end])){
int min = a[0];
int i;
for(i=0 ; i<length ; i++){
if(min > a[i]){
min = a[i];
}
}
printf("find mix %d\n", min);
return ;
}
}
}
if(a[start] < a[end]){
printf("find mix! %d\n", a[start]);
}
}