From 1dc64b16859d95446a8bfe1c50692ce57316bc42 Mon Sep 17 00:00:00 2001 From: "D.Sunil" Date: Fri, 13 Oct 2023 01:43:32 +0530 Subject: [PATCH] Update BinarySearch (#4747) --- .../searches/PerfectBinarySearch.java | 62 +++++++++++++------ .../searches/PerfectBinarySearchTest.java | 43 +++++++++++++ 2 files changed, 87 insertions(+), 18 deletions(-) create mode 100644 src/test/java/com/thealgorithms/searches/PerfectBinarySearchTest.java diff --git a/src/main/java/com/thealgorithms/searches/PerfectBinarySearch.java b/src/main/java/com/thealgorithms/searches/PerfectBinarySearch.java index bfeb5efc..495e2e41 100644 --- a/src/main/java/com/thealgorithms/searches/PerfectBinarySearch.java +++ b/src/main/java/com/thealgorithms/searches/PerfectBinarySearch.java @@ -1,28 +1,54 @@ package com.thealgorithms.searches; -class PerfectBinarySearch { +import com.thealgorithms.devutils.searches.SearchAlgorithm; - static int binarySearch(int[] arr, int target) { - int low = 0; - int high = arr.length - 1; +/** + * Binary search is one of the most popular algorithms The algorithm finds the + * position of a target value within a sorted array + * + *

+ * Worst-case performance O(log n) Best-case performance O(1) Average + * performance O(log n) Worst-case space complexity O(1) + * + * @author D Sunil (https://github.com/sunilnitdgp) + * @see SearchAlgorithm + */ - while (low <= high) { - int mid = (low + high) / 2; +public class PerfectBinarySearch implements SearchAlgorithm { - if (arr[mid] == target) { - return mid; - } else if (arr[mid] > target) { - high = mid - 1; + /** + * @param array is an array where the element should be found + * @param key is an element which should be found + * @param is any comparable type + * @return index of the element + */ + @Override + public > int find(T[] array, T key) { + return search(array, key, 0, array.length - 1); + } + + /** + * This method implements the Generic Binary Search iteratively. + * + * @param array The array to make the binary search + * @param key The number you are looking for + * @return the location of the key, or -1 if not found + */ + private static > int search(T[] array, T key, int left, int right) { + while (left <= right) { + int median = (left + right) >>> 1; + int comp = key.compareTo(array[median]); + + if (comp == 0) { + return median; // Key found + } + + if (comp < 0) { + right = median - 1; // Adjust the right bound } else { - low = mid + 1; + left = median + 1; // Adjust the left bound } } - return -1; - } - - public static void main(String[] args) { - int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - assert PerfectBinarySearch.binarySearch(array, -1) == -1; - assert PerfectBinarySearch.binarySearch(array, 11) == -1; + return -1; // Key not found } } diff --git a/src/test/java/com/thealgorithms/searches/PerfectBinarySearchTest.java b/src/test/java/com/thealgorithms/searches/PerfectBinarySearchTest.java new file mode 100644 index 00000000..0ba0b03b --- /dev/null +++ b/src/test/java/com/thealgorithms/searches/PerfectBinarySearchTest.java @@ -0,0 +1,43 @@ +import static org.junit.jupiter.api.Assertions.*; + +import com.thealgorithms.searches.PerfectBinarySearch; +import org.junit.jupiter.api.Test; + +/** + * @author D Sunil (https://github.com/sunilnitdgp) + * @see PerfectBinarySearch + */ +public class PerfectBinarySearchTest { + + @Test + public void testIntegerBinarySearch() { + Integer[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + PerfectBinarySearch binarySearch = new PerfectBinarySearch<>(); + + // Test cases for elements present in the array + assertEquals(0, binarySearch.find(array, 1)); // First element + assertEquals(4, binarySearch.find(array, 5)); // Middle element + assertEquals(9, binarySearch.find(array, 10)); // Last element + assertEquals(6, binarySearch.find(array, 7)); // Element in the middle + + // Test cases for elements not in the array + assertEquals(-1, binarySearch.find(array, 0)); // Element before the array + assertEquals(-1, binarySearch.find(array, 11)); // Element after the array + assertEquals(-1, binarySearch.find(array, 100)); // Element not in the array + } + + @Test + public void testStringBinarySearch() { + String[] array = {"apple", "banana", "cherry", "date", "fig"}; + PerfectBinarySearch binarySearch = new PerfectBinarySearch<>(); + + // Test cases for elements not in the array + assertEquals(-1, binarySearch.find(array, "apricot")); // Element not in the array + assertEquals(-1, binarySearch.find(array, "bananaa")); // Element not in the array + + // Test cases for elements present in the array + assertEquals(0, binarySearch.find(array, "apple")); // First element + assertEquals(2, binarySearch.find(array, "cherry")); // Middle element + assertEquals(4, binarySearch.find(array, "fig")); // Last element + } +}