1+ public  class  rotated_binary_search {
2+ 
3+  static  int  binarySearch (int  arr [], int  low , int  high , int  key ) 
4+  { 
5+  if  (high  < low ) 
6+  return  -1 ; 
7+  
8+  /* low + (high - low)/2; */ 
9+  int  mid  = (low  + high ) / 2 ; 
10+  if  (key  == arr [mid ]) 
11+  return  mid ; 
12+  if  (key  > arr [mid ]) 
13+  return  binarySearch (arr , (mid  + 1 ), high , key ); 
14+  return  binarySearch (arr , low , (mid  - 1 ), key ); 
15+  } 
16+ 
17+  static  int  pivotedBinarySearch (int  arr [], int  n , int  key ) 
18+  { 
19+  int  pivot  = findPivot (arr , 0 , n  - 1 ); 
20+  if  (pivot  == -1 ) 
21+  return  binarySearch (arr , 0 , n  - 1 , key ); 
22+  
23+  
24+  if  (arr [pivot ] == key ) 
25+  return  pivot ; 
26+  if  (arr [0 ] <= key ) 
27+  return  binarySearch (arr , 0 , pivot  - 1 , key ); 
28+  return  binarySearch (arr , pivot  + 1 , n  - 1 , key ); 
29+  } 
30+ 
31+  static  int  findPivot (int  arr [], int  low , int  high ) 
32+  { 
33+  // base cases  
34+  if  (high  < low ) 
35+  return  -1 ; 
36+  if  (high  == low ) 
37+  return  low ; 
38+  
39+  /* low + (high - low)/2; */ 
40+  int  mid  = (low  + high ) / 2 ; 
41+  if  (mid  < high  && arr [mid ] > arr [mid  + 1 ]) 
42+  return  mid ; 
43+  if  (mid  > low  && arr [mid ] < arr [mid  - 1 ]) 
44+  return  (mid  - 1 ); 
45+  if  (arr [low ] >= arr [mid ]) 
46+  return  findPivot (arr , low , mid  - 1 ); 
47+  return  findPivot (arr , mid  + 1 , high ); 
48+  }
49+ 
50+  public  static  void  main (String  [] args ){
51+  int  arr1 [] = { 5 , 6 , 7 , 8 , 9 , 10 , 1 , 2 , 3  }; 
52+  int  n  = arr1 .length ; 
53+  int  key  = 3 ; 
54+  System .out .println ("Index of the element is : " 
55+  + pivotedBinarySearch (arr1 , n , key )); 
56+  }
57+ }
0 commit comments