Меня попросили улучшить данный алгоритм быстрой сортировки:
public void quickSort(Comparable[] a, int left, int right) {
// Sort a[left…right] into ascending order.
if (left < right) {
int p = partition(a, left, right);
quickSort(a, left, p-1);
quickSort(a, p+1, right);
}
}
public int partition(Comparable[] a, int left, int right) {
// Partition a[left…right] such that
// a[left…p-1] are all less than or equal to a[p]
// and a[p+1…right] are all greater than or equal to
// a[p]. Return p.
Comparable pivot = a[left];
int p = left;
for (int r = left+1; r <= right; r++) {
int comp = a[r].compareTo(pivot);
if (comp < 0) {
a[p] = a[r]; a[r] = a[p+1];
a[p+1] = pivot; p++;
}
}
return p;
}
... используя инструкции psude-code ниже, чтобы он мог работать с меньшим количеством копий, чем исходный алгоритм:
To partition a[left…right] such that a[left…j–1] are all less than or equal to a[j],
and a[j+1…right] are all greater than or equal to a[j]:
1. Set pivot to a[left].
2. Set i = left + 1 and j = right.
3. While i <= j, repeat:
3.1. While i <= j and a[i] <= pivot, increment i.
3.2. While j >= i and a[j] >= pivot, decrement j.
3.3. If i < j, swap a[i] and a[j].
4. If j != left, set a[left] to a[j], and a[j] to pivot.
5. Terminate with answer j.
Проблема в том, что я не могу разобраться с этим битом:
While i <= j and a[i] <= pivot,
поскольку я получаю сообщение об ошибке, в котором говорится, что я не могу использовать знаки <и> с Comparable. Я нашел несколько решений онлайн, но ни одно из них не помогло.
Есть идеи?
Я бы очень признателен за подсказки, так как у меня не хватает времени для этого проекта.
Спасибо!
Marcepan
КОД ПОСЛЕ ИЗДАНИЯ:
public int partition(Comparable[] a, int left, int right) {
// Partition a[left…right] such that
// a[left…p-1] are all less than or equal to a[p]
// and a[p+1…right] are all greater than or equal to
// a[p]. Return p.
Comparable pivot = a[left];
int i = left +1;
int j = right;
while (i<=j){
while (i<=j && a[i].compareTo(pivot) <= 0){
i++;
}
while (i>=j && a[j].compareTo(pivot) >= 0){
j--;
}
if (i<j){
a[i] = a[j];
}
}
if ( j != left){
a[left] = a[j];
a[j] = pivot;
}
return j;
}