package ru.fuzzysearch;
/**
* .
*/
public class BinarySearch {
/**
*
*/
public static interface Comparator {
public int compare(int index);
}
/**
* , , < 0
*
* @param start
* ()
* @param end
* ( )
* @param comparator
*
* @return
*/
public static int lowerBound(int start, int end, Comparator comparator) {
int count = end - start;
while (count > 0) {
int current = start;
int step = count / 2;
current += step;
if (comparator.compare(current) < 0) {
start = ++current;
count -= step + 1;
}
else count = step;
}
return start;
}
/**
* , , <= 0
*
* @param start
* ()
* @param end
* ( )
* @param comparator
*
* @return
*/
public static int upperBound(int start, int end, Comparator comparator) {
int count = end - start;
while (count > 0) {
int current = start;
int step = count / 2;
current += step;
if (comparator.compare(current) <= 0) {
start = ++current;
count -= step + 1;
}
else count = step;
}
return start;
}
}
|