Java Bubblesort仅交换第一个数组项
我的冒泡排序代码仅交换第一个数组项。所有其他项目保留为0。我认为我的嵌套循环是错误的,或者我还不能正确地诊断它。这是我的代码Java Bubblesort仅交换第一个数组项,java,arrays,for-loop,sorting,bubble-sort,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(i
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个。如果还有人能帮助我,我将不胜感激。详细解释了原因。总之,java按值传递参数,swap方法只交换局部变量,但对sortArray方法中的变量没有影响
一个简单的解决方法是将交换代码直接包含在if中。注意:我没有检查您的代码的其余部分。例如,您可能想交换数组中的元素而不是索引。中详细解释了原因。总之,java按值传递参数,swap方法只交换局部变量,但对sortArray方法中的变量没有影响
一个简单的解决方法是将交换代码直接包含在if中。注意:我没有检查您的代码的其余部分。例如,您可能想交换数组中的元素,而不是索引。您使用的是两倍于i计数器:
for(int i = 0; i < allArraySize; i++) {
targetArray[i] = sourceArray[i];
for (i = 0; i < allArraySize; i++) {
...
可能是内部循环正在覆盖外部循环中使用的i计数器。您使用的i计数器是外部循环的两倍:
for(int i = 0; i < allArraySize; i++) {
targetArray[i] = sourceArray[i];
for (i = 0; i < allArraySize; i++) {
...
可能是内部循环正在覆盖外部循环中使用的i计数器。请注意,这是我第一次发布Stackoverflow。我已经用很多语言编写了程序,但没有一种是真正的O-O语言。我已经在业余时间攻击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,但我还是为自己最终找到了答案而感到自豪。但是天哪。。。。很平常的事情让人困惑,是吗
另一方面,我想我学会了引用的含义以及如何处理它
我猜我无意中封装了swap方法的工作原理,因此遵循了O-O原则。所以双倍好吗
但这让我不禁要问:在这种程度上分而治之只是一个愚蠢的想法吗?毕竟,将三行交换例程与排序例程的其余部分内联是常识,但我的交换方法是愚蠢的,或者,如果不是最好的,至少是好的Java实践?请注意,这是我第一次发表Stackoverflow。我已经用很多语言编写了程序,但没有一种是真正的O-O语言。我已经在业余时间攻击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,但我还是为自己最终找到了答案而感到自豪。但是天哪。。。。很平常的事情让人困惑,是吗
另一方面,我想我学会了引用的含义以及如何处理它
我猜我无意中封装了swap方法的工作原理,因此遵循了O-O原则。所以双倍好吗
但这让我不禁要问:在这种程度上分而治之只是一个愚蠢的想法吗?毕竟,将三行交换例程与排序例程的其余部分内联是常识,但是我的交换方法是愚蠢的,或者,如果不是最好的,那么至少是好的Java实践吗?另外,为了在交换方法中实现这一点,您将需要如下内容:void swapint i,int j,int[]arr{int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}另外,为了在交换方法中实现这一点,您将需要如下内容:void swapint i,int j,int[]arr{int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}