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 }