0

研究一种方法,该方法使用中位数算法的中位数选择一个枢轴来查找数组中的第 k 个最小元素;但是它似乎没有在返回后退出pickCleverPivot:

return median(A,left,right);

如果有帮助,假设最初左边是 0,右边是 9,A 是 {1,2,3,4,5,6,7,8,9,10}。

这是方法:

private static int pickCleverPivot(int left, int right, int[] A){

    int index = 0;                                                  
    if((right-left) <= 5){                                          
        return median(A,left,right);
    }

    for(int i = 0; i < (A.length+5-1)/5; i++){      //Ceiling of n/5 = (A.length+5-1)/5). 

        int R = left+4;  
        if(R > right){
            R = right;                                              
        }

        int med_index = median_index(A,left,R);

        swap(A, med_index, index);
        index++;
        left +=5;
    }

    left = 0;
    return pickCleverPivot(left, left+(A.length+5-1)/5, A);

}
4

3 回答 3

3

您的代码应该无法忽略 return 语句。

也许您创建了一个无限循环?如果您想在代码中查找错误,只需添加大量打印语句即可。例如,在返回之前打印所有方法的返回值。

如果您仍然找不到错误,您应该发布您的所有代码,以便我们能够自行运行您的代码。

于 2016-09-30T18:53:55.577 回答
0

我想我找到了些东西 :

每次对函数进行递归调用时,它都使用相同的参数。(A.length+5-1)/5保持相同的值,因为A始终是相同的数组。所以如果它大于 5,你永远不会逃避你的递归函数,因为right - left < 5它总是假的。

于 2016-09-30T19:09:21.927 回答
0

我会说,进行逐步调试,很可能存在一个无限循环,导致返回停止从该方法返回。否则,请粘贴完整的代码,我可以尝试查找错误。

于 2016-09-30T18:58:14.630 回答