/** * Binary search for integer arrays. * * @author Stefan Nilsson, snilsson@nada.kth.se * @version 09-01-20 */ public class BinarySearch { public static final int NOT_FOUND = -1; /** * Returns index of the first occurence of key in the sorted * array v, or -1 if key is not found. *

* If the array isn't sorted the behavior is undefined. *

* Time complexity: O(log n), where n = v.length. */ public int binSearch(int[] v, int key) { if (v.length > 0) return binSearch(v, 0, v.length - 1, key); else return NOT_FOUND; } /** * Returns index of the first occurence of key in the sorted * subarray v[first..last], or -1 if key is not found. * Precondition: first <= last. */ private int binSearch(int[] v, int first, int last, int key) { if (first == last) { return key == v[first] ? first : NOT_FOUND; } // subarray with more than one element int mid = first + (last - first)/2; if (key <= v[mid]) { return binSearch(v, first, mid, key); } else { return binSearch(v, mid + 1, last, key); } } /** * Unit test. Run with java -ea BinarySearch. */ public static void main(String[] args) { BinarySearch bs = new BinarySearch(); int[] v0 = {}; assert bs.binSearch(v0, 0) == NOT_FOUND; int[] v1 = {1}; assert bs.binSearch(v1, 0) == NOT_FOUND; assert bs.binSearch(v1, 1) == 0; assert bs.binSearch(v1, 2) == NOT_FOUND; int[] v2a = {1, 3}; assert bs.binSearch(v2a, 0) == NOT_FOUND; assert bs.binSearch(v2a, 1) == 0; assert bs.binSearch(v2a, 2) == NOT_FOUND; assert bs.binSearch(v2a, 3) == 1; assert bs.binSearch(v2a, 4) == NOT_FOUND; int[] v2b = {1, 1}; assert bs.binSearch(v2b, 0) == NOT_FOUND; assert bs.binSearch(v2b, 1) == 0; assert bs.binSearch(v2b, 2) == NOT_FOUND; int[] v3a = {1, 3, 5}; assert bs.binSearch(v3a, 0) == NOT_FOUND; assert bs.binSearch(v3a, 1) == 0; assert bs.binSearch(v3a, 2) == NOT_FOUND; assert bs.binSearch(v3a, 3) == 1; assert bs.binSearch(v3a, 4) == NOT_FOUND; assert bs.binSearch(v3a, 5) == 2; assert bs.binSearch(v3a, 6) == NOT_FOUND; int[] v3b = {1, 1, 3}; assert bs.binSearch(v3b, 0) == NOT_FOUND; assert bs.binSearch(v3b, 1) == 0; assert bs.binSearch(v3b, 2) == NOT_FOUND; assert bs.binSearch(v3b, 3) == 2; assert bs.binSearch(v3b, 4) == NOT_FOUND; int[] v3c = {1, 3, 3}; assert bs.binSearch(v3c, 0) == NOT_FOUND; assert bs.binSearch(v3c, 1) == 0; assert bs.binSearch(v3c, 2) == NOT_FOUND; assert bs.binSearch(v3c, 3) == 1; assert bs.binSearch(v3c, 4) == NOT_FOUND; int[] v3d = {1, 1, 1}; assert bs.binSearch(v3d, 0) == NOT_FOUND; assert bs.binSearch(v3d, 1) == 0; assert bs.binSearch(v3d, 2) == NOT_FOUND; int min = Integer.MIN_VALUE; int max = Integer.MAX_VALUE; int[] v = {min, min, -1, -1, 0, 1, 1, max, max, max}; assert bs.binSearch(v, min) == 0; assert bs.binSearch(v, -1) == 2; assert bs.binSearch(v, 0) == 4; assert bs.binSearch(v, 1) == 5; assert bs.binSearch(v, max) == 7; assert bs.binSearch(v, -1000) == NOT_FOUND; assert bs.binSearch(v, 1000) == NOT_FOUND; } }