首先(正如标题所暗示的那样)我没有找到为什么波纹管分区方法不起作用,而是对它进行修改以便它可以用于以下输入:
int[] a = {1,2,8,4,5,7};
这里有partition
方法以及其他一些内容:
static int[] swap (int[] a,int i,int j){
int t = a[i];
a[i] = a[j];
a[j] = t;
return a;
}
static int partition (int[] a,int l,int r){
int i = l;
int j = r;
int v = a[l];
while (true) {
while (a[i] < v) {
if (i == r) break;
i++;
}
while (a[j] > v) {
if (j == l) break;
j--;
}
if (i >= j) break;
a = swap(a,i,j);
}
a = swap(a, l, j);
return j;
}
void sort(int[] a,int l,int r){
int j = partition(a, l, r);
sort(a, l, j-1);
sort(a, j+1, r);
}
public static void main(String[] args) {
int[] a = {1,2,8,4,5,7};
System.out.println(partition(a,0,5));
}
输出:
0
输出是从partition
方法返回的数据透视的索引。 0
,作为枢轴的索引,在定义方面有意义,即everything left of the pivot is smaller and everything right of the pivot is larger
,但显然遇到sort
中的问题,即:
sort(a, l, j-1);
你的右指针为负(j-1 = 0-1 = -1
)。我的问题再次出现了上述方法的修改,它将维护定义(everything left of the pivot is smaller and everything right of the pivot is larger
)而不会遇到sort
中的问题。
答案 0 :(得分:0)
缺少的部分是
行if ( l >= r ) return;
在sort
方法的开头。这实际上是递归停止步骤,因此无论如何都必须使用它来防止无休止的递归。但除此之外,它还解决了您的问题,因为如果您调用sort(0,-1)
,则-1小于0,因此它会阻止对该索引的进一步处理。