給定一個排序後的數組,包含n個整數,但這個數組已被旋轉過屢次,找出數組中的某個元素

/**數組

 * 功能:給定一個排序後的數組,包含n個整數,但這個數組已被旋轉過屢次,次數不詳。找出數組中的某個元素。spa

 * 能夠假定數組元素原先是按從小到大的順序排列的。.net

 */排序

 

  1. /** 
  2.  * 思路:數組被旋轉過了,則尋找拐點。 
  3.  * @param a 
  4.  * @param left 
  5.  * @param right 
  6.  * @param x:要搜索的元素 
  7.  * @return 
  8.  */  
  9. public static int search(int[] a,int left,int right,int x){  
  10.     int mid=(left+right)/2;  
  11.     if(x==a[mid])//找到元素  
  12.         return mid;  
  13.     if(left>right)  
  14.         return -1;  
  15.       
  16.     if(a[left]<a[mid]){//左半邊爲正常順序  
  17.         if(x>=a[left]&&x<=a[mid]){  
  18.             return search(a,left,mid-1,x);//搜索左半邊  
  19.         }else{  
  20.             return search(a, mid+1, right, x);//搜索右半邊  
  21.         }  
  22.     }else if(a[mid]<a[right]){//右半邊爲正常順序  
  23.         if(x>=a[left]&&x<=a[mid]){  
  24.             return search(a,left,mid-1,x);//搜索左半邊  
  25.         }else{  
  26.             return search(a, mid+1, right, x);//搜索右半邊  
  27.         }  
  28.     }else if(a[left]==a[mid]){//左半邊是重複元素  
  29.         if(a[mid]!=a[right]){//若右邊元素不一樣,則搜索右邊  
  30.             return search(a, mid+1, right, x);//搜索右半邊  
  31.         }else{//不然兩邊都搜索  
  32.             int result=search(a, left, mid=1, x);  
  33.             if(result==-1){  
  34.                 return search(a, mid+1, right, x);  
  35.             }else  
  36.                 return result;  
  37.         }  
  38.     }  
  39.     return -1;  
相關文章
相關標籤/搜索