Chciałbym sprawdzić, czy jest to poprawna implementacja QuickSorta, Wydaje się, że wykonuje tę pracę, ale czy czegoś mi brakuje?Czy to jest poprawna implementacja 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);
}
}
stałej:
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);
}
}
należy zmienić nazwę "T" jako coś bardziej widocznego na przykład "temp". Powinieneś sprawdzić, czy (lo + hi)/2 jest> = 0 i
martinatime
IMO, nie używaj "T" jako nazwy zmiennej, ponieważ jest ona często używana jako parametr typu podczas używania generycznych. – zmf
co robisz, jeśli masz duplikaty? porówna się do tego samego, a compareTo zwróci 0. w ten sposób, lo nigdy nie stanie się> = hi i otrzymasz niekończącą się pętlę –