Binary search implementation

  1         public class BinarySearchSolution
  2         {
  3             public int BinarySearch(int[] array, int target)
  4             {
  5                 int low = 0, high = array.Length;
  6 
  7                 while (low < high)
  8                 {
  9                     int mid = low + (high - low) / 2;
 10                     if (array[mid] == target)
 11                     {
 12                         return mid;
 13                     }
 14                     else if (array[mid] < target)
 15                     {
 16                         low = mid + 1;
 17                     }
 18                     else
 19                     {
 20                         high = mid;
 21                     }
 22                 }
 23 
 24                 return ~low;
 25             }
 26 
 27             public int BinarySearchRecursive(int[] array, int target)
 28             {
 29                 return Recursive(array, target, 0, array.Length);
 30             }
 31             
 32             private int Recursive(int[] array, int target, int start, int end)
 33             {
 34                 if (start > end || start >= array.Length)
 35                 {
 36                     return ~start;
 37                 }
 38 
 39                 if (start == end)
 40                 {
 41                     return array[start] == target ? start : ~start;
 42                 }
 43 
 44                 int mid = start + (end - start) / 2;
 45                 if (array[mid] == target)
 46                 {
 47                     return mid;
 48                 }
 49                 else if (array[mid] < target)
 50                 {
 51                     return Recursive(array, target, mid + 1, end);
 52                 }
 53                 else
 54                 {
 55                     return Recursive(array, target, start, mid - 1);
 56                 }
 57             }
 58 
 59             public int BinarySearchLower(int[] array, int target)
 60             {
 61                 int low = 0, high = array.Length;
 62 
 63                 while (low < high)
 64                 {
 65                     int mid = low + (high - low) / 2;
 66                     if (array[mid] == target)
 67                     {
 68                         if (mid > 0 && array[mid - 1] == target)
 69                         {
 70                             high = mid;
 71                         }
 72                         else
 73                         {
 74                             return mid;
 75                         }
 76                     }
 77                     else if (array[mid] < target)
 78                     {
 79                         low = mid + 1;
 80                     }
 81                     else
 82                     {
 83                         high = mid;
 84                     }
 85                 }
 86 
 87                 return ~low;
 88             }
 89             public int BinarySearchHigher(int[] array, int target)
 90             {
 91                 int low = 0, high = array.Length;
 92 
 93                 while (low < high)
 94                 {
 95                     int mid = low + (high - low) / 2;
 96                     if (array[mid] == target)
 97                     {
 98                         if (mid < array.Length - 1 && array[mid + 1] == target)
 99                         {
100                             low = mid + 1;
101                         }
102                         else
103                         {
104                             return mid;
105                         }
106                     }
107                     else if (array[mid] < target)
108                     {
109                         low = mid + 1;
110                     }
111                     else
112                     {
113                         high = mid;
114                     }
115                 }
116 
117                 return ~low;
118             }
119         }

 

posted @ 2017-12-28 14:32  逸朵  阅读(142)  评论(0)    收藏  举报