packagecom.thealgorithms.searches;importstaticjava.lang.String.format;importjava.util.Arrays;importjava.util.Random;importjava.util.stream.Stream;importcom.thealgorithms.devutils.searches.SearchAlgorithm;publicclassTernarySearchimplementsSearchAlgorithm{/**
* @param arr The **Sorted** array in which we will search the element.
* @param value The value that we want to search for.
* @return The index of the element if found. Else returns -1.
*/@Overridepublic<TextendsComparable<T>>intfind(T[] arr,T value){returnternarySearch(arr, value,0, arr.length -1);}/**
* @param arr The **Sorted** array in which we will search the element.
* @param key The value that we want to search for.
* @param start The starting index from which we will start Searching.
* @param end The ending index till which we will Search.
* @return Returns the index of the Element if found. Else returns -1.
*/private<TextendsComparable<T>>intternarySearch(T[] arr,T key,int start,int end){if(start > end){return-1;}/* First boundary: add 1/3 of length to start */int mid1 = start +(end - start)/3;/* Second boundary: add 2/3 of length to start */int mid2 = start +2*(end - start)/3;if(key.compareTo(arr[mid1])==0){return mid1;}elseif(key.compareTo(arr[mid2])==0){return mid2;}/* Search the first (1/3) rd part of the array.*/elseif(key.compareTo(arr[mid1])<0){returnternarySearch(arr, key, start,--mid1);}/* Search 3rd (1/3)rd part of the array */elseif(key.compareTo(arr[mid2])>0){returnternarySearch(arr, key,++mid2, end);}/* Search middle (1/3)rd part of the array */else{returnternarySearch(arr, key, mid1, mid2);}}publicstaticvoidmain(String[] args){// just generate dataRandom r =newRandom();int size =100;int maxElement =100000;Integer[] integers
=Stream.generate(()-> r.nextInt(maxElement)).limit(size).sorted().toArray(Integer[]::new);// the element that should be foundInteger shouldBeFound = integers[r.nextInt(size -1)];TernarySearch search =newTernarySearch();int atIndex = search.find(integers, shouldBeFound);System.out.println(format("Should be found: %d. Found %d at index %d. An array length %d",
shouldBeFound, integers[atIndex], atIndex, size));int toCheck =Arrays.binarySearch(integers, shouldBeFound);System.out.println(format("Found by system method at an index: %d. Is equal: %b", toCheck, toCheck == atIndex));}}