Java Bubble Sort仅交换第一个数组项

时间:2012-11-25 18:41:21

标签: java arrays for-loop sorting bubble-sort

我的冒泡排序代码只交换第一个数组项。所有其他项目保留为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.如果有人仍然能够帮助我会非常感激。

3 个答案:

答案 0 :(得分:3)

this post详细解释了原因。总之,java按值传递参数,而swap方法仅交换局部变量,但对sortArray方法中的变量没有影响。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

(请注意,这是我在Stackoverflow上的第一篇文章。我已用多种语言编写程序,其中没有一种是真正的O-O。我在业余时间一直在攻击Java一个月左右。)

与msg 1中的原始代码一样,我觉得需要通过一个单独的程序进行交换,因为这样做在Pascal,VBasic等中很有用(并且受到鼓励),作为“鸿沟 - 的一部分 - 并征服“编程实践。所以对我来说非常令人费解,为什么我的相同的 swap 例程在Java中不起作用......直到我重新 -read关于参数传递。我终于明白了,为了改变它的内容,需要传递数组本身

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

以上对我有用,并且尽管我努力吸收Java,但我真的很自豪我终于明白了。但是geez ......非常常见的事情让人感到困惑,是吗?

另一方面,我想我已经了解参考的含义以及如何处理它。

我想我无意中封装了 swap 方法的工作方式,从而遵循了O-O的宗旨。那么......双重好吗?

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