如何在递归中保持参数不变?

时间:2013-07-22 19:27:07

标签: java recursion quicksort

我正在尝试实施快速排序算法,这是我的代码:

public class Sort {

int count = 0;

public void Partition(int A[], int l, int h) {

    if ((h-l) > 1) {

    count += (h-l) - 1;    

        int pivot = A[l];
        int i = l+1;
        int temp;
        int j;

        for (j = l + 1; j < h; j++) {

            if (A[j] < pivot) {  // SWAP
                temp = A[i];
                A[i] = A[j];
                A[j] = temp;
                i++;
            }
            // else : j++            
        }

        temp = A[i-1];   
        A[i-1] = A[l];
        A[l] = temp;

        Partition(A, l, i-1);               
        Partition(A, i, A.length);

    }
  }
}

代码对输入数组进行排序,但是当我计算比较次数时,它会给出一个数字,远远大于比较的原始数量。我添加了一个断点并逐步移动到代码中,发现问题出在最后两行: 分区(A,l,i-1); 分区(A,i,A,长度);

第二次调用中发送的'i'是第一次调用函数Partition产生的结果,而不是第一个代码中的'i'。例如,代码第一次在以下输入上运行: 3 8 4 6 10 2 5 7 1 输出为:1 2 3 4 6 10 9 5 7 8 而我= 3。 然后第一次调用分区需要i(其中i等于3)并且不断更改i的值,当它最终完成时,i的值不同于3,并且另一个错误的值被发送到第二个递归调用。

我的问题是,有没有办法,这两个调用采用相同的参数i,没有人改变它?

2 个答案:

答案 0 :(得分:1)

试试这个。不要试图在Partition中进行排序;从那里,只返回索引i(当然,你必须将返回类型更改为int)。然后编写一个不同的方法来实现快速排序。

public static void quicksort(int[] n, int left, int right){
if (left<right){
int pivotindex=Partition(n, left, right);
quicksort(n, left, pivotindex-1);
quicksort(n, pivotindex+1, right);}
}

我用以下方法对此进行了测试,结果非常好。

public static void main(String[] args){
int[] n= new int[8];
n[0]=3;
n[6]=2;
n[1]=5;
n[3]=20;
quicksort(n, 0, n.length);
for (int i=0; i<n.length; i++){
    System.out.print(n[i]+",");
}
}

答案 1 :(得分:0)

由于Java使用按值传递,因此第一次调用无法更改参数i的值,因为被调用的方法没有引用它 您可能希望第二次调用Partition成为下一个调用。但是,第一个调用将依次调用Partition两次,导致下一次执行Partition的参数值与您预期的不同。

另外,请使用小写字母开始您的方法名称。