快速计数器示例

时间:2016-10-25 07:15:50

标签: java algorithm quicksort

首先(正如标题所暗示的那样)我没有找到为什么波纹管分区方法不起作用,而是对它进行修改以便它可以用于以下输入:

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中的问题。

1 个答案:

答案 0 :(得分:0)

缺少的部分是

if ( l >= r ) return;

sort方法的开头。这实际上是递归停止步骤,因此无论如何都必须使用它来防止无休止的递归。但除此之外,它还解决了您的问题,因为如果您调用sort(0,-1),则-1小于0,因此它会阻止对该索引的进一步处理。