1

我的冒泡排序代码只交换第一个数组项。所有其他项目都保留为 0。我认为我的嵌套循环是错误的,或者我还无法正确诊断它。所以这是我的代码。

    public void swap(int i, int j) {

    int temp;

    temp = i;
    i = j;
    j = temp;
}


public void sortArray(int [] sourceArray, int [] targetArray, int allArraySize){

    for(int i = 0; i < allArraySize; i++) {
        targetArray[i] = sourceArray[i];
        for (i = 0; i < allArraySize; i++) {
            for(int j = i+1; j < allArraySize;j++) {
                if(targetArray[i] > targetArray[j]) {
                    swap(i, j);
                }
            }

        }

    }
}

非常感谢您的反馈。我(显然)是编程新手。我已将代码更改为此。

public void sortArray(int [] sourceArray, int [] targetArray, int allArraySize){
    int temp;

    for(int i = 0; i < allArraySize; i++) {
        targetArray[i] = sourceArray[i];
        for (i = 0; i < allArraySize; i++) {
            for(int j = i+1; j < allArraySize;j++) {
                if(targetArray[i] > targetArray[j]) {
                    temp = targetArray[i];
                    targetArray[i] = targetArray[j];
                    targetArray[j] = temp;
                }
            }

        }

    }
}

结果仍然只是交换 1 项,但现在是最后 1 项。如果有人仍然能够提供帮助,我将不胜感激。

4

3 回答 3

3

原因在这篇文章中有详细解释。总之,java按值传递参数,您的swap方法只交换局部变量,但对方法中的变量没有影响sortArray

一个简单的解决方法是将 的代码swap直接包含在您的if. 注意:我尚未检查您的其余代码。例如,您可能打算交换数组中的元素而不是索引。

于 2012-11-25T18:43:17.383 回答
1

您使用的是 i 计数器的两倍:

for(int i = 0; i < allArraySize; i++) {
    targetArray[i] = sourceArray[i];
        for (i = 0; i < allArraySize; i++) {
        ...

可能内部循环正在覆盖外部循环中使用的 i 计数器。

于 2012-11-25T18:45:24.557 回答
0

(请注意,这是我在 Stackoverflow 上的第一篇文章。我用过多种语言进行编程,但没有一种是真正的 OO。我在空闲时间攻击 Java 已经有一个月左右的时间了。)

与 msg 1 中的原始代码一样,我觉得有必要通过单独的过程进行交换,因为作为“分而治之”的一部分,在 Pascal、VBasic 等中这样做非常有效(并且受到鼓励) “编程实践。所以我也很困惑,为什么我的相同交换例程在 Java 中不起作用......直到我重新阅读参数传递。我终于明白了,需要传递数组本身才能更改其内容。

public static void swap(int [] a, int i, int j) {
    int c  = a[i];
      a[i] = a[j];
      a[j] = c;
  }

以上对我有用,尽管我一直在努力吸收 Java,但我真的很自豪我终于弄明白了。但是,天啊.... 很平常的事情令人困惑,是吧?

另一方面,我想我通过参考学习了什么以及如何应对它。

而且我想我无意中封装交换方法的工作原理,从而遵循了 OO 原则。所以……双倍好?

但这让我不禁要问:“分而治之”排序到这种程度只是一个愚蠢的想法吗?毕竟,将 3 行交换程序与排序程序的其余部分内联是常识,但我的交换方法只是愚蠢的,或者,如果不是“最好的”,那么至少是“好的”Java 实践?

于 2013-09-01T19:40:57.907 回答