From 014bfda4f906e3dd76311310e34db586aa0f7793 Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 19 Apr 2018 09:44:48 +0300 Subject: [PATCH] Fixed bug with an infinite loop when an array doesn't contain a key Fulfilled the code style request --- .../src/search/IterativeTernarySearch.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Searches/src/search/IterativeTernarySearch.java b/Searches/src/search/IterativeTernarySearch.java index 74ef850ae..684d48c16 100644 --- a/Searches/src/search/IterativeTernarySearch.java +++ b/Searches/src/search/IterativeTernarySearch.java @@ -34,19 +34,26 @@ public class IterativeTernarySearch implements SearchAlgorithm { public > int find(T[] array, T key) { int left = 0; int right = array.length - 1; - while (true) { + + while (right > left) { + int leftCmp = array[left].compareTo(key); int rightCmp = array[right].compareTo(key); if (leftCmp == 0) return left; if (rightCmp == 0) return right; - int leftThird = left + (right - left) / 3; - int rightThird = right - (right - left) /3; + int leftThird = left + (right - left) / 3 + 1; + int rightThird = right - (right - left) / 3 - 1; - if (array[leftThird].compareTo(key) <= 0) left = leftThird; - else right = rightThird; + + if (array[leftThird].compareTo(key) <= 0) { + left = leftThird; + } else { + right = rightThird; + } } + return -1; } @@ -64,11 +71,12 @@ public class IterativeTernarySearch implements SearchAlgorithm { IterativeTernarySearch search = new IterativeTernarySearch(); 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)); + 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)); + System.out.println(format("Found by system method at an index: %d. Is equal: %b", + toCheck, toCheck == atIndex)); }