diff --git a/algorithms/Java/README.md b/algorithms/Java/README.md index 91f5c09e..12f58878 100644 --- a/algorithms/Java/README.md +++ b/algorithms/Java/README.md @@ -54,6 +54,7 @@ - [Allocate minimum number of pages](searching/allocate-min-pages.java) - [Exponential Search](searching/Exponential-search.java) - [Interpolation Search](searching/interpolation-search.java) +- [Ternery Search](searching/ternery-search.java) ## Sorting diff --git a/algorithms/Java/searching/ternery-search.java b/algorithms/Java/searching/ternery-search.java new file mode 100644 index 00000000..be33d131 --- /dev/null +++ b/algorithms/Java/searching/ternery-search.java @@ -0,0 +1,142 @@ +// Java program to illustrate +// the iterative approach to ternary search +// + +class main { + + // Function to perform Ternary Search + // recursive Function + // Time Complexity: O(log3n) + // Auxiliary Space: O(log3n) + + static int ternarySearchRecursive(int l, int r, int key, int ar[]) + + { + while (r >= l) { + + // Find the mid1 mid2 + int mid1 = l + (r - l) / 3; + int mid2 = r - (r - l) / 3; + + // Check if key is present at any mid + if (ar[mid1] == key) { + return mid1; + } + if (ar[mid2] == key) { + return mid2; + } + + // Since key is not present at mid, + // check in which region it is present + // then repeat the Search operation + // in that region + + if (key < ar[mid1]) { + + // The key lies in between l and mid1 + r = mid1 - 1; + } + else if (key > ar[mid2]) { + + // The key lies in between mid2 and r + l = mid2 + 1; + } + else { + + // The key lies in between mid1 and mid2 + l = mid1 + 1; + r = mid2 - 1; + } + } + + // Key not found + return -1; + } + + // Function to perform Iterative Ternary Search + // Time Complexity: O(log3n), where n is the size of the array. + // Auxiliary Space: O(1) + + static int ternarySearchIterative(int l, int r, int key, int ar[]) + + { + while (r >= l) { + + // Find the mid1 mid2 + int mid1 = l + (r - l) / 3; + int mid2 = r - (r - l) / 3; + + // Check if key is present at any mid + if (ar[mid1] == key) { + return mid1; + } + if (ar[mid2] == key) { + return mid2; + } + + // Since key is not present at mid, + // check in which region it is present + // then repeat the Search operation + // in that region + + if (key < ar[mid1]) { + + // The key lies in between l and mid1 + r = mid1 - 1; + } + else if (key > ar[mid2]) { + + // The key lies in between mid2 and r + l = mid2 + 1; + } + else { + + // The key lies in between mid1 and mid2 + l = mid1 + 1; + r = mid2 - 1; + } + } + + // Key not found + return -1; + } + + + // Driver code + public static void main(String args[]) + { + int l, r, p, key; + + // Get the array + // Sort the array if not sorted + int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + + // Starting index + l = 0; + + // length of array + r = 9; + + // Checking for 5 + + // Key to be searched in the array + key = 5; + + // Search the key using ternarySearch + p = ternarySearchRecursive(l, r, key, ar); + + // Print the result + System.out.println("Index of " + key + " is " + p); + + // Checking for 50 + + // Key to be searched in the array + key = 50; + + // Search the key using ternarySearch + p = ternarySearchIterative(l, r, key, ar); + + // Print the result + System.out.println("Index of " + key + " is " + p); + } +}