Я реализую (единую сводную) быструю сортировку в Java.
Я прочитал, что есть термин разбиения, и я подумал, что могу написать метод с расширяемостью.
public static <E> void sort(
final List<? extends E> list,
final Comparator<? super E> comparator,
final BiFunction<List<? extends E>, Comparator<? super E>, Integer> partitioner) {
if (list.size() < 2) {
return;
}
final int p = partitioner.apply(list, comparator);
sort(list.subList(0, p), comparator, partitioner);
sort(list.subList(p + 1, list.size()), comparator, partitioner);
}
Это показалось мне хорошим. Первоначальное намерение - дать возможность выбрать любую логику секционирования c с помощью BiFunction
, которая берет несортированный список и компаратор и возвращает индекс секционирования.
И я попытался добавить другой метод для Схема разбиения Lomuto .
static <E> void lomuto(final List<? extends E> list,
final Comparator<? super E> comparator) {
sort(list,
comparator,
(l, c) -> {
final E pivot = l.get(l.size() - 1);
int i = 0;
for (int j = 0; j < l.size() - 1; j++) {
if (c.compare(l.get(j), pivot) <= 0) {
swap(l, j, i++);
}
}
swap(l, l.size() - 1, i);
return i;
});
}
И компилятор жалуется на c.compare(l.get(j), pivot)
part.
Required type Provided
o1: capture of ? super capture of ? extends E E
o2: capture of ? super capture of ? extends E E
Я обнаружил, что могу работать с
static <E> void lomuto(final List<E> list, final Comparator<? super E> comparator) {
Как я все еще могу сделать PECS методом lomuto
? ? extends E