//把一个数组最开始的若干个元素搬到数组的末尾。eg:{3,4,5,1,2}是{1,2,3,4,5}的旋转数组 #include "stdafx.h" #include <iostream> using namespace std; int MinInOrder(int data[],int index1,int index2); int Min(int data[],int length) { if(data==NULL||length<=0) throw new exception("Invalid Parameters:"); int index1=0; int index2=length-1; int indexMid=index1;//tips1: while(data[index1]>=data[index2]) { if(index2-index1==1) { indexMid=index2; break; } indexMid=(index1+index2)/2; //tips2:如果index1,index2,indexMid三者相同,就只能顺序查找 if(data[index1]==data[index2]&&data[index1]==data[indexMid]) return MinInOrder(data,index1,index2); if(data[indexMid]>=data[index1]) index1=indexMid; else if(data[indexMid]<=data[index2]) index2=indexMid; } return data[indexMid]; } int MinInOrder(int data[],int index1,int index2) { int result=data[index1]; for(int i=index1+1;i<index2;i++) { if(result>data[i]) result=data[i]; } return result; } int _tmain(int argc, _TCHAR* argv[]) { int *data=NULL; //int data[1]={1}; //int data[5]={1,2,3,4,5}; //int data[5]={3,4,5,1,2}; //int data[5]={1,1,1,0,1}; cout<<Min(data,5)<<endl; return 0; }
tips1:把indexMid初始化为index1是因为,一旦发现数组中第一个数字小于最后一个数字,表明该数组是排序的,就可以直接返回第一个数字了。
tips2:如果index1,index2,indexMid三者相同,无法判断中间数字是位于前面子数组还是后面数组中,也就无法移动两个指针来缩小查找范围。此时,不得不采用顺序查找。