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