Эта статья делится с вами вариантом Java, реализующей бинарный поиск справки. Конкретный контент заключается в следующем
Обычный бинарный поиск:
Сначала просмотрите обычный бинарный поиск
ПРИМЕЧАНИЕ. Существует проблема с бинарным поиском: когда в массиве есть дубликации, такие как {3, 3, 3, 3}, когда бинарный поиск 3, возврат ARR [1], что означает, что бинарный поиск не вернет позицию 0 первого появления 3.
Public Class BinarySearch {public static <T Extens сопоставимо <? Super t >> int search (t arr [], t value) {int left = 0; int right = arr.length - 1; while (слева <= справа) {int mid = (слева и справа) + ((слева ^ справа) >> 1); if (arr [mid] .compareto (value) == 0) {return mid; } else if (arr [mid] .compareto (value)> 0) {right = mid - 1; } else {left = mid + 1; }} return -1; } public static void main (string [] args) {integer [] arr = new Integer [] {1, 3, 3, 6, 7, 9}; //-1 System.out.println (search (arr, 0)); // 0 system.out.println (search (arr, 1)); // 5 System.out.println (Search (Arr, 9)); //-1 System.out.println (search (arr, 10)); // 2 System.out.println (Search (Arr, 3)); }}Двухпартийный вариант: функция FindFirst
В обычном бинарном поиске поиск в [слева ... справа] с левой закрытой и правой штрих. Если элемент со значением найден, он считается найденным. Это не так в этой функции FindFirst. В [слева ... справа] с левой закрытой правой закрытой интервалом, когда элемент со значением равна значению, вместо правого = середина-1, пусть вправо = середина, продолжайте искать в [слева ... справа] с левой закрытой правой штриховой интервалом. Петля выходит, когда влево == правая наконец выходит.
После выхода из петли можно найти значение, или может быть, что цикл не найдет значение после прохождения полного массива, и выходит из петли.
Поэтому после выхода из петли вы должны судить, какая ситуация.
Public Class BinarySearch {public static <T Extens сопоставимо <? Super t >> int findfirst (t arr [], t value) {int left = 0; int right = arr.length - 1; // Выход, когда влево> = справа, ситуация "=" Здесь отличается от двоичного, в то время как (слева <справа) {int mid = (слева + справа) >> 1; if (arr [mid] .compareto (value) <0) {left = mid + 1; } else {right = mid; }} // после прохождения вышеупомянутого цикла. Была бы найдена значение? Все еще не было найдено? Просто вынесите суждение. if (arr [left] == value) {return left; } else {return -1; }} public static void main (string [] args) {integer [] arr = new Integer [] {1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 9}; //-1 System.out.println (findfirst (arr, 0)); // 0 system.out.println (findfirst (arr, 1)); // 12 System.out.println (findfirst (arr, 9)); //-1 System.out.println (findfirst (arr, 10)); // 1 System.out.println (findfirst (arr, 3)); }}Двухпартийный вариант: меньше функции
представлять
Учитывая массив и переменное значение, найдите число из массива, которое наиболее близко к значению и меньше значения. Например, arr = {11, 22, 22, 33, 33, 33, 44, 54} Значение = 33. 22 ближе всего к значению и меньше значения.
Таким образом, ответ составляет 2 (22 в нижнем углу маркера в массиве ARR).
Если не найдено число меньше значения, то вывод -1.
Решение
Используйте метод бинарного поиска. Каждый раз используйте ARR [MID], чтобы сравнить со значением. Маленький, равный, идите налево, чтобы найти это; Большой, иди вправо, чтобы искать это. Вы можете не понимать «равную» ситуацию в предыдущем предложении. Обычный двоичный поиск состоит в том, чтобы найти значение ARR [MID] ==, в то время как меньше функции - найти число меньшего значения, поэтому, хотя значение ARR [MID] ==, вы должны продолжать искать меньшее значение слева.
пример
Код
Public Class BinarySearch {public static <T Extens сопоставимо <? Super t >> int меньше (t arr [], t value) {int Left = 0; int right = arr.length - 1; // выйти, когда влево> справа (слева <= справа) {int mid = (слева и справа) + ((слева ^ вправо) >> 1); if (value.compareto (arr [mid]) <= 0) {right = mid - 1; } else {left = mid + 1; }} вернуть право; } public static void main (string [] args) {integer [] arrf = new Integer [] {21, 23, 25, 25, 31, 34, 37, 39, 52, 63}; // 3 System.out.println (меньше (arrf, 30)); }}Двухпартийный вариант: большая функция
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.