Java 链表上选择排序的输出不正确

Java 链表上选择排序的输出不正确,java,Java,我的链表选择排序有问题,如下所示: public static void selectionSort(LN l) { for (LN r = l; r != null; r = r.next) { LN min = r; for (LN s = r; s != null; s = s.next) if (min.value > s.value) min = s; LN temp

我的链表选择排序有问题,如下所示:

public static void selectionSort(LN l) {
    for (LN r = l; r != null; r = r.next) {
        LN min = r;
        for (LN s = r; s != null; s = s.next)
            if (min.value > s.value)
                min = s;
        LN temp = r;
        r.value = min.value;
        min.value = temp.value;
    }
}
所以对于输入:10,4,6,2,1,7,9,8,5,3 我得到输出:1,1,1,1,3,3,3,3,3

这里的排序有什么问题吗?

这是:

        LN temp = r;
        r.value = min.value;
        min.value = temp.value;
这是错误的。通过将
temp
设置为等于
r
,实际上是使它们引用同一对象;因此修改
r.value
相当于修改
temp.value
。因此,上述结果并没有真正修改
min.value
;它只是将
min.value
设置为原来的值

相反,你应该写:

        int temp = r.value;
        r.value = min.value;
        min.value = temp;

while
循环有什么问题吗?OP不能为此使用getter/setter吗?@siebz0r:getter的编写通常与底层字段等效,setter的编写则与底层字段的赋值等效
r.setValue(min.getValue())
min.setValue(temp.getValue())
实际上不会改变任何东西。或者你的意思是别的?setter不是通过值而不是引用来设置,从而解决了问题吗?@siebz0r:对不起,不是。你似乎对值和引用在Java中的工作方式感到困惑-/