Быстрая сортировка в Java с использованием Comparable - PullRequest
2 голосов
/ 04 августа 2011

Меня попросили улучшить данный алгоритм быстрой сортировки:

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;

}

Ответы [ 4 ]

2 голосов
/ 04 августа 2011

Вместо a < b вы пишете a.compareTo(b) < 0.

Другие операторы сравнения записываются аналогично, поэтому

a[i] <= pivot

становится

a[i].compareTo(pivot) <= 0
1 голос
/ 04 августа 2011

Это сопоставимые объекты, поэтому вы не можете использовать <= .. вам следует использовать метод CompareTo. </p>

while i <= j and ( a[i].compareTo(pivot) <= 0 )
1 голос
/ 04 августа 2011

Я бы использовал тот же код, который вы написали

int comp = a[r].compareTo(pivot);
if (comp < 0) {
1 голос
/ 04 августа 2011

Вам нужно использовать метод compareTo() для сопоставимых взамен:

То есть a<b становится a.compareTo(b)<0. Метод compareTo вернет <0, если a меньше b, 0, если они одинаковые, и> 0, если a больше b.

Это необходимо, поскольку Java не поддерживает перегрузку операторов, поэтому такие операторы, как «меньше», «больше чем» и т. Д., Могут использоваться только для примитивных типов (за некоторыми исключениями, например со строками), но не для каких-либо библиотечных классов или интерфейсов.

Если вы используете это на практике, а не только для академических целей, тогда использование Collections.sort() почти всегда будет быстрее, чем ваша собственная реализация!

...