我一直在尝试用Java编写一个选择排序程序,并且(通过浏览其他论坛后)认为我的代码是正确的。 Curretnly它是
public class SelectionSort {
public static int[] selectionSort(int[] numbers) {
for (int i = 0; i < numbers.length; i++) {
int currentMin = i;
for(int k = i+1; k < numbers.length; k++) {
if (numbers[k] < numbers[currentMin]) {
currentMin = k;
if(currentMin != i) {
int placeholder = numbers[i];
numbers[i] = numbers[currentMin];
numbers[currentMin] = placeholder;
}
}
}
}
return numbers;
}
}
当我运行3个样本数组时,其中一些有效,有些则无效。我在下面的数组之前和之后都是:
[5,2,7,6,8,1,5]
[1,2,5,5,6,7,8](正确的顺序)
[5,2,4,0,8,7,6,3,0,7,8,5,4,6,3,0,8,7,7,6,3,9,0]
[3,0,3,0,2,3,0,0,4,4,5,5,6,6,6,7,7,7,8,8,8,9] (错误的顺序)
[8,5,7,6,2,7,6,1,2,5,4,9]
[2,1,5,4,2,6,7,7,5,5,8,9](错误的顺序)
当我转动括号时,他们就是这样:
public class SelectionSort {
public static int[] selectionSort(int[] numbers) {
for (int i = 0; i < numbers.length; i++) {
int currentMin = i;
for(int k = i+1; k < numbers.length; k++) {
if (numbers[k] < numbers[currentMin]) {
currentMin = k;
}
if(currentMin != i) {
int placeholder = numbers[i];
numbers[i] = numbers[currentMin];
numbers[currentMin] = placeholder;
}
}
}
return numbers;
}
}
我得到了这些结果
[5,2,7,6,8,1,5]
[5,2,5,1,6,7,8](错误)
[5,2,4,0,8,7,6,3,0,7,8,5,4,6,3,0,8,7,7,6,3,9,0]
[0,0,0,0,2,3,3,3,4,4,5,5,6,6,6,7,7,7,8,8,8,9] (右)
[8,5,7,6,2,7,6,1,2,5,4,9]
[1,2,5,5,2,6,6,7,7,8,4,9](错误)
基本上,我如何获得它以便所有数组都以正确的方式排序?我真的不确定错误在哪里,因为将它与其他代码进行比较来做类似的事情,似乎是一致的。 感谢
答案 0 :(得分:4)
此元素交换:
if(currentMin != i) {
int placeholder = numbers[i];
numbers[i] = numbers[currentMin];
numbers[currentMin] = placeholder;
}
应该在整个内循环之外。
选择排序是在数组的剩余部分(内部循环)中找到最小元素,并使用当前位置中的元素交换此最小值。因此,每次外循环迭代最多只有一次交换。
答案 1 :(得分:0)
您的内部循环正在交换i
而不是currentMin
你可以这样修改(也可能不需要if(currentMin != i) {
)
int placeholder = numbers[currentMin];
numbers[currentMin] = numbers[i];
numbers[i] = placeholder;