Tôi muốn kiểm tra xem đây có phải là việc triển khai chính xác QuickSort hay không, có vẻ như đang thực hiện công việc, nhưng tôi có bỏ sót điều gì không?Đây có phải là cách triển khai nhanh chóng đúng không?
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);
}
}
cố định:
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);
}
}
bạn nên đổi tên "T" như một cái gì đó rõ ràng hơn như "tạm thời". Bạn nên kiểm tra xem liệu (lo + hi)/2 là> = 0 và
martinatime
IMO, không sử dụng 'T' làm tên biến vì nó thường được sử dụng làm thông số loại khi sử dụng Generics. – zmf
bạn sẽ làm gì nếu bạn có bản sao? nó sẽ so sánh với cùng, và compareTo sẽ trả về 0. do đó, lo sẽ không bao giờ trở thành> = hi và bạn nhận được một vòng lặp vô tận –