使用Comparable在Java中快速排序

时间:2011-08-04 15:37:15

标签: java quicksort comparable

我被要求改进快速排序算法:

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,

因为我收到错误消息,说我不能使用&lt;和&gt;标志与可比较。我在网上找到的解决方案很少,但都没有。

有什么想法吗? 我真的很感谢快速的线索,因为我没有时间参与这个项目。

谢谢! 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 个答案:

答案 0 :(得分:2)

而不是a < b,您可以写a.compareTo(b) < 0

其他比较运算符的编写方式相似,所以

a[i] <= pivot

成为

a[i].compareTo(pivot) <= 0

答案 1 :(得分:1)

您需要使用compareTo()方法来代替:

因此a<b变为a.compareTo(b)<0。如果a小于b,compareTo方法将返回&lt; 0,如果它们相同则返回0,如果a大于b,则返回&gt;

这是必需的,因为Java不支持运算符重载,因此诸如小于,大于等的运算符只能用于基本类型(有一些例外,例如字符串),而不能用于任何库类或接口。

作为一个侧面点,如果你在实践中使用它而不仅仅是出于学术目的,那么使用Collections.sort()几乎总是比你自己的实现更快!

答案 2 :(得分:1)

我会使用您编写的相同代码

int comp = a[r].compareTo(pivot);
if (comp < 0) {

答案 3 :(得分:1)

它们是Comparable对象,所以你不能使用&lt; = ..你应该使用compareTo方法。

while i <= j and ( a[i].compareTo(pivot) <= 0 )