我是Java的新手,我正在尝试编写一个选择排序程序。 以下是我的代码:
public class SelectionSort {
public static int a[] = {6, 4, 9, 3, 1, 7};
public static void main(String[] args) {
int min, i, j;
for(i = 0; i < a.length - 1; i++) {
min = i ;
for(j = i + 1; j < a.length; j++) {
if (a[j] < a[min]) {
min = j;
}
if (min != i) {
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
}
for (i = 0; i < a.length; i++) {
System.out.println("a : " + a[i]);
}
}
}
我的输入数组是6,4,9,3,1,7
。排序的输出应为1,3,4,6,7,9
但我得到的输出是:
a : 3
a : 4
a : 6
a : 7
a : 1
a : 9
我正在做一些我无法弄清楚的小错误。有人可以帮我解决一下吗?
答案 0 :(得分:13)
你快到了。
交换元素的部分应该在外部内部循环。
换句话说,你需要首先找到数组其余部分中的最小元素,然后将交换到当前位置。现在,只要找到一个较小的数字,就会进行交换,并且在此过程中无法跟踪这个较小数字的新位置。
修复代码的另一种方法是保持交换位置,但在每次交换后更新min
:
if (min !=i) {
int temp = a[i];
a[i] = a[min];
a[min]= temp;
min = i; /* Update `min' to reflect the number's new position */
}
这也有效,但效率很低。
P.S。 if (min != i)
检查是不必要的,因为与自身交换元素是无害的无操作。
答案 1 :(得分:6)
您正在为内循环的每次迭代交换元素将下面的块放在内循环之外。您应该只交换外循环的每次迭代。
if (min !=i) {
int temp = a[i];
a[i] = a[min];
a[min]= temp;
}
答案 2 :(得分:6)
为什么你不能在比赛中使用比较器。由于您是java新手,您也可以学习java提供的功能。请查看以下示例。
import java.util.Comparator;
public class MyIntComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return (o1>o2 ? -1 : (o1==o2 ? 0 : 1));
}
}
--------------------------------------------------------
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Simple2 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(4);
list.add(3);
list.add(7);
list.add(2);
list.add(1);
Collections.sort(list, new MyIntComparable());
for (Integer integer : list) {
System.out.println(integer);
}
}
}
答案 3 :(得分:0)
Simple logic to approach any algo is to break into multiple step :
### Step 1 − Set MIN to location 0 or any high Value
### Step 2 − Search the minimum element in the list
### Step 3 − Swap with value at index of minimum
### Step 4 − Repeat until iteration gets over
e.g. <br>
14, 33, 27, 10, 35, 19, 42, 44 <br>
**10**, 33, 27, **14**, 35, 19, 42, 44 <br>
10, **14**, 27, **33**, 35, 19, 42, 44 <br>
10, 14, **19**, 33, 35, **27**, 42, 44 <br>
10, 14, 19, **27**, 35, **33**, 42, 44 <br>
10, 14, 19, 27, **33**, **35**, 42, 44 <br>
10, 14, 19, 27, 33, 35, **42**, 44 skip as no min found
final int[] intArr = new int[]{14, 33, 27, 10, 35, 19, 42, 44};
int index = -1;
boolean isMin;
for (int i = 0; i < intArr.length; i++) {
int min = 999999999;
isMin = false;
for (int j = i + 1; j < intArr.length; j++) {
if (intArr[j] < min && intArr[i] >= intArr[j]) {
min = intArr[j];
index = j;
isMin = true;
}
}
if (isMin) {
intArr[index] = intArr[i];
intArr[i] = min;
}
}
Arrays.stream(intArr).forEach(System.out::println);