2

我需要帮助使用选择排序对整数数组进行排序。由于某些原因,它不会排序。下面是我的演示/主要。

  02 
  20 
  01 

它应该是

  01 
  02 
  20

我的演示/主要:

    public static void main(String[] args) {


    SelectionSortArray[] ints = new SelectionSortArray[3];

    ints [0] = new SelectionSortArray(02);
    ints [1] = new SelectionSortArray(20);
    ints [2] = new SelectionSortArray(01);

    System.out.println("Unsorted array: ");

    for (int index = 0; index < ints.length; index++) {
        System.out.println(ints[index]);
    }


    SelectionSort.selectionSort(ints);

    System.out.println(" ");

    System.out.println("Sorted array using selection sort: ");

    for (int index = 0; index < ints.length; index++) {
        System.out.println(ints[index]);
    }


}
4

3 回答 3

2

compareToSelectionSortArray课堂上的方法不正确。如果当前对象小于另一个对象,则该compareTo方法必须返回小于零的值,但您要返回.int1

引用链接的 Javadocs:

将此对象与指定对象进行比较以进行排序。返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。

尝试以下更改:

if (num == other.num) {
    result = 0;   // This was correct; no change here.
} else if (num < other.num) {
    result = -1;  // Changed from 1 to -1.
} else {
    result = 1;   // 1 or 2 is fine, as long as it's positive
}
于 2013-08-29T17:10:59.580 回答
0

请注意,随着对 的更改compareTo

return Integer.compare(this.num,other.num)

实施哪个以简洁的方式返回您要返回的内容

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

如果您想以您在问题中列出的方式查看打印输出,请使用

System.out.format("%02d%n",ints[index].num);

或更改toString()return String.format("%02d",num)

您可能还想查看java.util.Arrays源代码,看看有多少其他类似的方法已经实现。还可以考虑更改您的类名以表明它包含数字CustomNumber并封装您的类以避免直接访问num.

您的代码中还有另一个有趣的问题

    SelectionSortArray[] ints = new SelectionSortArray[8];
    ints[0] = new SelectionSortArray(01);
    ints[1] = new SelectionSortArray(02);
    ints[3] = new SelectionSortArray(03);
    ints[4] = new SelectionSortArray(04);
    ints[5] = new SelectionSortArray(05);
    ints[6] = new SelectionSortArray(06);
    ints[7] = new SelectionSortArray(07);
    ints[8] = new SelectionSortArray(08);//???

如果你在一个数字之前,0它将是一个八进制数,并且允许的数字是 0 - 7 因此你会在上面看到编译错误。还

    System.out.println(0123);
    System.out.println(0234);

不会打印

0123
0234

正如您(未)预期的那样!

83
156

在代码中使用八进制数时要小心。

于 2013-08-29T17:47:55.343 回答
0

您的 CompareTo 函数是错误的。只需将其更改为:

public int compareTo(SelectionSortArray other) {
    return num.compareTo(other.num);     
}

关键是 -1 / 0 / 1 返回码,而不是您正在使用的“0,1,2”。

通常,如果您要比较内置类型,只需委托给内置比较运算符会更容易。

注意:要使用“num.compareTo”,您需要使用“Integer”而不是“int”。如果您想坚持使用“int”,则需要 rgettman 发布的解决方案。

于 2013-08-29T17:19:22.583 回答