我被要求改进快速排序算法:
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;
}
答案 0 :(得分:2)
答案 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 )