Я хотел бы проверить, является ли это правильной реализацией QuickSort. Кажется, что это делается, но я ничего не упускаю?Является ли это правильной реализацией quicksort?
public class QuickSort implements Sorter {
public void sort(Comparable[] items) {
QuickSort(items, 0, items.length - 1);
}
static void QuickSort(Comparable[] items, int a, int b) {
int lo = a;
int hi = b;
if (lo >= hi) {
return;
}
Comparable mid = items[(lo + hi)/2];
Comparable T;
while (lo < hi) {
while (items[lo].compareTo(mid)<0) {
lo++;
}
while (mid.compareTo(items[hi])<0) {
hi--;
}
if (lo < hi) {
T = items[lo];
items[lo] = items[hi];
items[hi] = T;
}
}
QuickSort(items, a, lo);
QuickSort(items, lo == a ? lo + 1 : lo, b);
}
}
исправлено:
private static void quickSort(Comparable[] items, int a, int b) {
int i = a;
int j = b;
Comparable x = items[(a+ b)/2];
Comparable h;
do {
while (items[i].compareTo(x) < 0) {
i++;
}
while (items[j].compareTo(x) > 0) {
j--;
}
if (i <= j) {
h = items[i];
items[i] = items[j];
items[j] = h;
i++;
j--;
}
} while (i <= j);
if (a < j) {
quickSort(items, a, j);
}
if (i < b) {
quickSort(items, i, b);
}
}
вы должны переименовать "Т", как-то более очевидной, например, как "Темп". Вы должны проверить, есть ли (lo + hi)/2> = 0 и
martinatime
IMO, не используйте 'T' в качестве имени переменной, поскольку он обычно используется как параметр типа при использовании дженериков. – zmf
Что вы будете делать, если у вас есть дубликаты? он будет сравниваться с тем же, и compareTo вернет 0. Таким образом, lo никогда не станет> = hi, и вы получите бесконечный цикл –