2

我正在尝试编写一些在作业中给出的伪代码 - 但是我现在正在做的编码部分不是作业的一部分,只是为了好玩。

伪代码的一部分说“交换数组的元素”。在我的代码中,我必须在两个地方执行此操作。但是我想知道是否有一种方法可以通过只创建一个方法来做到这一点,即创建另一种方法来简单地交换它们并保存我每次想要运行它时使用的额外代码行。

问题是,如果我在这个方法之外创建一个全新的方法,我将不得不将数组作为参数发送并取出它,我担心这会降低效率(显然没什么大不了的在这里,但我正在努力为未来的大型项目学习)。

这是我的代码,其中包含重复的“交换”方法行。

public int[] myAlgorithm(int[] arrayOfInts, int size){
    boolean done = true;
    int j= 0;

    while (j <= n-2){
        if (arrayOfInts[j] > arrayOfInts[j+1]){
            int tempHolder = arrayOfInts[j];
            arrayOfInts[j] = arrayOfInts[j+1];
            arrayOfInts[j+1] = tempHolder;
            done = false;
        }
        j = j + 1;
    }
    j = size - 1;
    while (j >= 1){
        if (arrayOfInts[j] <= arrayOfInts[j-1]){
            int tempHolder = arrayOfInts[j];
            arrayOfInts[j] = arrayOfInts[j+1];
            arrayOfInts[j+1] = tempHolder;
            done = false;
        }
        j--;
    }
    if (!done)
        myAlgorithm(arrayOfInts, size)
    else
        return arrayOfInts;
}
4

5 回答 5

3

我必须将数组作为参数发送并取出

您只需要“发送”并直接在阵列上工作。在实践中,将参数传递给方法是一种非常便宜的操作,如果调用得足够频繁,编译器可能会对其进行优化,因此您不必担心太多(除非您通过分析证明这是性能损失你的申请)。

在您的情况下,您可以使用以下方法:

public void swap(int[] arrayOfInts, int i, int j) {
    int tempHolder = arrayOfInts[i];
    arrayOfInts[i] = arrayOfInts[j];
    arrayOfInts[j] = tempHolder;
}

你会称之为:

swap(arrayOfInts, j, j+1);

为什么它有效?

Java 通过值传递参数,但在对象(即非原始类型,包括数组)的情况下,传递的值是对对象的引用。换句话说,swap 方法的参数是对与调用代码中相同的数组的引用,因此您可以直接处理该数组,而无需将其发送回调用方法。

于 2013-01-23T22:46:49.960 回答
1

如果有重复的代码位,则运行时间会更短。虽然它需要更多的空间。

问题是您无法预测编译器将如何优化您的代码。您可以创建一个函数,该函数采用数组和两个索引并交换这些索引处的元素。编译器可能会将代码内联到您调用它的函数中。如果你不这样做,编译器可能会注意到你有重复的代码,如果它决定创建一个函数。

编写代码以您最容易阅读的方式编写,尤其是在效率差异很小的情况下。

于 2013-01-23T22:46:55.783 回答
1

问题是,如果我在这个方法之外创建一个全新的方法,我将不得不将数组作为参数发送并取出......

事实并非如此。在 Java 中,数组是一个对象。因此,当您将数组传递给方法时,您实际上只是传递了对数组的引用。您对方法内的数组所做的任何更改都将在方法调用之后出现。仅传递对数组的引用也意味着该方法将非常快,因为您没有制作整个数组的副本。

所以你可以写一个交换方法:

private void swap(int[] arrayOfInts, int i, int j) {
    int temp = arrayOfInts[i];
    arrayOfInts[i] = arrayOfInts[j];
    arrayOfInts[j] = temp;
}
于 2013-01-23T22:48:10.167 回答
1

数组,与任何其他引用类型的对象一样,都是通过引用传递的——也就是说,对对象的引用是通过值传递的。这意味着,数组本身不会被复制。因此,没有理由担心“效率低下”。

于 2013-01-23T22:48:16.560 回答
1

在java中,您可以将数组作为变量传递,这只会传递指向它的指针而不是数组的全新副本,因此您必须传递数组和要交换的两个索引:

 public static void swap(final int[] arr, final int         pos1, final int pos2){
final int temp = arr[pos1];
arr[pos1] = arr[pos2];
arr[pos2] = temp;
}
于 2013-01-23T22:49:07.673 回答