Me gustaría comprobar si esta es una implementación correcta de QuickSort, parece estar haciendo el trabajo, pero ¿me estoy perdiendo de algo?¿Es esta una implementación correcta de 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);
}
}
fijo:
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);
}
}
debe cambiar el nombre de "T" como algo más evidente como "temp". Debería verificar si (lo + hi)/2 es> = 0 y <ítems.length. Si lo desea, puede hacer que use un algoritmo de clasificación diferente cuando el conjunto de clasificación es pequeño (digamos 3 elementos). – martinatime
IMO, no use 'T' como nombre de variable porque se usa comúnmente como parámetro de tipo cuando se usan genéricos. – zmf
¿qué haces si tienes duplicados? se comparará con el mismo, y compareTo devolverá 0. por lo tanto, lo nunca se convertirá en> = hi y obtendrá un bucle infinito –