C++实现旋转数组的二分查找
本文实例讲述了C++实现旋转数组的二分查找方法,分享给大家供大家参考。具体方法如下:
题目要求:
旋转数组,如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,要求利用二分查找查找里面的数。
这是一道很有意思的题目,容易考虑不周全。这里给出如下解决方法:
#include<iostream> usingnamespacestd; intsequentialSearch(int*array,intsize,intdestValue) { intpos=-1; if(array==NULL||size<=0) returnpos; for(inti=0;i<size;i++) { if(array[i]==destValue) { pos=i; break; } } returnpos; } intnormalBinarySearch(int*array,intleftPos,intrightPos,intdestValue) { intdestPos=-1; if(array==NULL||leftPos<0||rightPos<0) { returndestPos; } intleft=leftPos; intright=rightPos; while(left<=right) { intmid=(right-left)/2+left; if(array[mid]==destValue) { destPos=mid; break; } else if(array[mid]<destValue) { left=mid+1; } else { right=mid-1; } } returndestPos; } introtateBinarySearch(int*array,intsize,intdestValue) { intdestPos=-1; if(array==NULL||size<=0) { returndestPos; } intleftPos=0; intrightPos=size-1; while(leftPos<=rightPos) { if(array[leftPos]<array[rightPos]) { destPos=normalBinarySearch(array,leftPos,rightPos,destValue); break; } intmidPos=(rightPos-leftPos)/2+leftPos; if(array[leftPos]==array[midPos]&&array[midPos]==array[rightPos]) { destPos=sequentialSearch(array,size,destValue); break; } if(array[midPos]==destValue) { destPos=midPos; break; } if(array[midPos]>=array[leftPos]) { if(destValue>=array[leftPos]) { destPos=normalBinarySearch(array,leftPos,midPos-1,destValue); break; } else { leftPos=midPos+1; } } else { if(array[midPos]<=array[rightPos]) { destPos=normalBinarySearch(array,midPos+1,rightPos,destValue); break; } else { rightPos=midPos-1; } } } returndestPos; } intmain() { //intarray[]={3,4,5,1,2}; //intarray[]={1,2,3,4,5}; //intarray[]={1,0,1,1,1}; //intarray[]={1,1,1,0,1}; //intarray[]={1}; //intarray[]={1,2}; intarray[]={2,1}; constintsize=sizeofarray/sizeof*array; for(inti=0;i<=size;i++) { intpos=rotateBinarySearch(array,size,array[i]); cout<<"find"<<array[i]<<"at:"<<pos+1<<endl; } for(inti=size;i>=0;i--) { intpos=rotateBinarySearch(array,size,array[i]); cout<<"find"<<array[i]<<"at:"<<pos+1<<endl; } }
希望本文所述对大家C++算法设计的学习有所帮助。