我想知道是否有人可以告诉我这个选择排序的逻辑(是的,它用于教育用途,我意识到有一个Arrays.sort()方法)是有缺陷的。
public static void selectionSortByName() throws IOException {
String temp;
for (int i = 0; i <= nameArraySize; i++){
String smallest = name[i];
for (int j = 0; j <= nameArraySize; j++){
if (name[j].compareTo(name[i]) < 0){
temp = smallest;
name[j] = temp;
name[i] = smallest;
}
}
}
}
我使用compareTo方法在我的行上得到NullPointerException,所以我希望我的一个条件中只有一个逻辑错误。
任何帮助都会很棒,谢谢!
答案 0 :(得分:2)
显然,您的nameArraySize
不符合数组name
的实际长度,或者名称[i]中的某些单元格等于null。
尽管如此,我还没有看到使用冗余变量的重点:
for (int i = 0; i < name.length; i++)
编辑:
啊,现在我看到了,你有<=
而不是<
答案 1 :(得分:0)
1)throws IOException
根本不是必要的!您的代码不会抛出此检查的异常。
2)将nameArraySize更改为name.length
3)正如我在评论中所说,将<=
更改为<
4)AFAIK selectionSort在找到最小的一个之前不会交换。
所以你的代码很好看:
public static void selectionSortByName() {
for (int i = 0; i < name.length; i++){
int smallest =i;
//invariant is sorted in all n < [i]
for (int j = i+1; j <= nameArraySize; j++){
if (name[j].compareTo(name[smallest]) < 0){
smallest=name[j];
}
}
if(!name[smallest].equals(name[i])){
swap(name,i,smallest);
}
}
}
public static void swap(String [] name,int i, int j){
String temp = name[j];
name[j] = name[i];
name[i] = temp;
}