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

标签 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,而不是第一个代码中的“i”。例如,代码第一次在以下输入上运行: 3 8 4 6 10 2 5 7 1 输出为: 1 2 3 4 6 10 9 5 7 8 我= 3。 然后对 Partition 的第一次调用采用 i(其中 i 等于 3)并不断更改 i 的值,当最终完成时,i 的值与 3 不同,并且另一个错误值被发送到第二次递归调用。

我的问题是,有没有办法让两个调用采用相同的参数 i,而无需任何人更改它?

最佳答案

试试这个。不要尝试在 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]+",");
}
}

关于java - 如何在递归中保持参数不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17795781/

相关文章:

algorithm - 实现随机快速排序算法

java - QuickSort 给出错误的排序顺序

Church 平等编码的递归

Java JComboBox 抑制更改监听器

java - 使用 JAXB 编码时出现 "Unrecognizable signature"错误

java - 带有 m2e 的 Eclipse Mars 无法更改 java 编译路径

python - 递归地在每个深度绘制带有颜色的谢尔宾斯基三角形?

java - 用代码计算数字问题中零的数量

Python 反向快速排序

java - mockito-groovy-支持不工作