面試題11:求旋轉陣列的最小數字
阿新 • • 發佈:2018-12-09
題目:把一個數組最開始的若干個元素搬到陣列末尾,即陣列的旋轉;
例如:{3,4,5,1,2}是{1,2,3,4,5}的一個旋轉,輸出該陣列的最小值1
程式碼如下:
#include<stdio.h> #include<stdlib.h> #include<string.h> //順序查詢最小值 int Order(int *numbers,int index1,int index2) { int result=numbers[index1]; for(int i=index1+1;i<=index2;++i) { if(result>numbers[i]) { result=numbers[i]; } } return result; } int Min(int *numbers,int length) { if(numbers==nullptr||length<=0) //判斷若陣列為空,或長度若小於0,則不合法 { printf("error"); } int index1=0; //初始化index1為0號下標,即第一個陣列 int index2=length-1; //初始化index2為最後一個數組的下標 int indexMid=index1; // while(numbers[index1]>=numbers[index2]) { if(index2-index1==1) { indexMid=index2; break; } indexMid=(index1+index2)/2; //讓indexMid 指向陣列中間的值 //若下標index1 index2 indexMid 的值都相等 則只能順序尋找 if(numbers[index1]==numbers[index2]&&numbers[indexMid]==numbers[index1]) { return Order(numbers,index1,index2); } //若中間值位於前面的遞增陣列,則在後面一半找最小值 if(numbers[indexMid]>=numbers[index1]) index1=indexMid; //若中間值位於後面的遞增陣列,則在前面一半找最小值 else if(numbers[indexMid]<=numbers[index2]) index2=indexMid; } return numbers[indexMid]; } int main() { int numbers1[5]={2,3,4,67,1}; int numbers2[5]={1,4,5,6,7}; int numbers3[5]={1,2,3,2,1}; printf("%d\n",Min(numbers1,5)); printf("%d\n",Min(numbers1,5)); printf("%d\n",Min(numbers1,5)); return 0; }