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

Java 如何在递归中保持参数不变?,java,recursion,quicksort,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;

我正在尝试实现快速排序算法,以下是我的代码:

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);

    }
  }
}
公共类排序{
整数计数=0;
公共无效分区(inta[],intl,inth){
如果((h-l)>1){
计数+=(h-l)-1;
int pivot=A[l];
int i=l+1;
内部温度;
int j;
对于(j=l+1;j
代码确实对输入数组进行了排序,但当我计算比较次数时,它给出了一个比原始比较次数大得多的数字。我在代码中添加了一个断点并逐步移动,发现问题在于最后两行: 分区(A,l,i-1); 分区(A,i,A,长度)

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


我的问题是,有没有一种方法可以让两个调用使用相同的参数i,而不需要任何人更改它?

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


另外,请以小写字母开头方法名称。

由于
Java
使用传递值,因此第一次调用无法更改参数
i
的值,因为被调用的方法没有引用它。
您可能希望对
分区的第二次调用是下一次调用。但是,第一次调用将依次调用
Partition
两次以上,导致下一次执行
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);}
}
publicstaticvoidquicksort(int[]n,int-left,int-right){

如果(左尝试此操作。不要尝试在
分区中进行排序
;从那里返回索引
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);}
}
publicstaticvoidquicksort(int[]n,int-left,int-right){

如果(左)第一次调用无法更改参数
i
的值。您一定弄错了。这就是我所想的,我的意思是,这就是我对递归的理解,但是当逐步进入递归时,我发现当代码进入第二次调用时,i的值是1,而不是3。第一次调用无法更改参数
i
的值。你一定弄错了。这就是我所想的,我的意思是这就是我对递归的理解,但是当我一步一步地进入它时,我发现当代码进入第二个调用时,i的值是1,而不是3。好吧,也许问题的原因不正确,但是你能告诉我问题在哪里吗m是?比较的数量应该是25,而它给了我62!好吧,很抱歉大写:)我知道分区在第二次调用实际发生之前会调用自己几次,但是“导致分区的下一次执行的参数值与您预期的不同”是什么意思这是否意味着“i”确实会改变?我的意思是它不会作为代码的结果值3发送到第二次调用,但它现在是调用分区几次后的结果值??不,在特定的方法调用中,
i
的值永远不会改变,但是由于您得到了太多调用,很容易忘记哪个exec注意调试时您正在观看。很抱歉,我甚至不知道您所说的比较次数是什么意思,也不知道您是如何计算的,因此我无法帮助您。没问题,谢谢您的帮助:)如果您感兴趣,number of Comparison是每次调用函数时pivot与之进行比较的元素数。至于调试,我不知道,但我认为我做对了,我的意思是,在调试时,函数会不断调用自己,直到高亮移动到下一个,这是在我检查I的值和不同!!我不知道怎么做。再次感谢。好吧,也许问题的原因不正确,但你能告诉我问题在哪里吗?比较的数量应该是25,而它给我62!好的,对不起,大写:)我知道在第二次调用实际发生之前,分区会调用自己好几次,但是“导致分区下一次执行的参数值与您预期的不同”是什么意思呢这是否意味着“i”确实发生了变化?我的意思是它没有作为代码的结果值3发送到第二次调用,但它现在是调用分区几次后的结果值??不,是