使用递归返回void方法

时间:2014-10-17 21:46:33

标签: java recursion return-value quicksort

我正在尝试对字符串数组实现快速排序,但我无法弄清楚如何从void方法返回字符串数组。 P.S。:以防万一我想告诉你所有其他方法,如交换和分区已经实施,我不认为你需要看到它们。使用任何第三方帮助程序库都不是一种选择。

public static String[] quicksort(String[] a)
{
    int low = 0;
    int high = a.length;
    quicksort_lomuto(a, low, high);
    return a; //<-- Here is the problem!!! What am I supposed to return?
}
public static void quicksort_lomuto(String[] a, int i, int j)
{
    if(j-i < 2) return;
    int k = partition_lomuto(a, i, j);
    quicksort_lomuto(a, i, k);
    quicksort_lomuto(a, k+1, j);
}

2 个答案:

答案 0 :(得分:1)

如果您必须返回void,则只需更改数组的内容即可。虽然数组参数已经通过值传递,但是&#34;值&#34;本质上是指向数组的指针,而不是数组的完整内容。一个例子:

 public static void main(String[] args) {
    String[] arr = new String[]{ "foo", "bar" };
    changeMyArray(arr);
    System.out.println(arr[0] + "," + arr[1]); // output is: foo,baz
 }

 private static void changeMyArray(String[] myArray) {
     myArray[1] = "baz";
 }

如果数组参数设置为(a = mumble),则从方法返回时不会反映出来。但是如果你将数组的内容设置为某个(a[i] = mumble),它就会。

您可能不希望改变输入数组。在这种情况下,您可以使用&#34;输出参数&#34;。

来实现相同的解决方案
public static void quicksort_lomuto(String[] inputArray, int i, int j, String[] outputArray)
{
    if (outputArray == null)
    {
        throw new IllegalArgumentException("outputArray cannot be null");
    }
    if (outputArray.length != inputarray.length)
    {
        throw new IllegalArgumentException(
            "outputArray must be the same length as inputArray");
    }
    /* sort inputArray, putting values into outputArray */
}

答案 1 :(得分:0)

如果您决定不返回任何新值,那么您操作值的唯一方法是在块之外可以访问新的排列是重新排列传递给函数的对象的内部内容。

例如,我可以实现

sort(int[] values)

使用看起来像

的块来运行
if (values[x] > values[y]) {
   int temp = values[x];
   values[x] = values[y];
   values[y] = temp;
}
...

现在,在方法完成后,通过参数列表传递的数组将会有所不同。

这是一种非常糟糕的编程风格/练习;但是,在极少数情况下,有必要移动您的集合或生成新的数据集合。这些在计算机科学中非常罕见,但它们确实出现在Terabyte范围内的数据集中。

另请注意,此类技术可允许在两个同时执行的调用中操作相同的数据,因此,如果您不使用单线程解决方案,则需要对数据进行分区并保护(通过您自己的方式)以防止破坏性并发访问。