diff --git a/algorithms/Python/README.md b/algorithms/Python/README.md index 9d534396..d1516ccf 100644 --- a/algorithms/Python/README.md +++ b/algorithms/Python/README.md @@ -17,6 +17,7 @@ 1. [Binary Search](searching/binary_search.py) 2. [Jump Search](searching/jump_search.py) 3. [Linear Search](searching/linear_search.py) +4. [Ternary Search](searching/ternary_search.py) ## Sorting 1. [Bubble Sort](sorting/bubble_sort.py) diff --git a/algorithms/Python/searching/ternary_search.py b/algorithms/Python/searching/ternary_search.py new file mode 100644 index 00000000..2df93f62 --- /dev/null +++ b/algorithms/Python/searching/ternary_search.py @@ -0,0 +1,47 @@ +""" + TERNARY SEARCH + Time Complexity: O(log3 N) + Working: Similar to binary search but here we have two searc point (mid) + Steps: + 1. Compare with elements at mid1 and mid2. Stop if found + 2. If more than mid1 and less than mid2 - working field is the second part + 3. If less than mid1 - working field is the first part + 4. If more than mid2 - working field is the third part +""" +arr = [10, 13, 46, 51, 139, 467] +targets = [2, 467] + +def ternarySearch(arr, target): + left, right = 0, len(arr) - 1 + index = -1 + + while(left <= right): + mid1, mid2 = left + (right - left) // 3, right - (right - left) // 3 + + # checking for condition 1 + if target == arr[mid1]: + index = mid1 + break + if target == arr[mid2]: + index = mid2 + break + + # checking for condition 2 + if target > arr[mid1] and target < arr[mid2]: + left, right = mid1 + 1, mid2 - 1 + + # checking for condition 3 + elif target < arr[mid1]: + right = mid1 - 1 + + # checking for condition 4 + else: + left = mid2 + 1 + return index + +for target in targets: + result = ternarySearch(arr, target) + if result == -1: + print(target, "is not present in", arr) + else: + print(target, "is present in the position:", result + 1)