JAVA - 按降序排序链表

时间:2012-02-07 12:06:11

标签: java algorithm sorting

我试着写一个排序链表的方法。 这是我的java培训。

该方法应获取带有值的链接列表,并使用选择排序对其进行排序。 不是通常的选择排序,而是选择排序找到最大数字并将其放在链表的开头。直到列表排序。

我试着按照调试器但是,我真的不明白我做错了什么。

这就是我累了:

public IntList selectionSort()
{
    IntNode tempMax = _head;
    IntNode current = _head;
    IntNode fromHere = null;
    IntNode toHere = _head;
    IntNode prev = null;
    while(toHere != null)
    {
        current = toHere;
        tempMax = toHere;
        while (current != null)
        {
            if (current.getNext() != null && current.getNext().getValue() > tempMax.getValue())
                {
                    prev = current;
                    tempMax = current.getNext();
                    current = current.getNext();
                }
            else current = current.getNext();      
        }
        prev.setNext(prev.getNext().getNext());
        tempMax.setNext(toHere);            
        if (fromHere == null)
            _head = tempMax;
        else fromHere.setNext(tempMax);
        fromHere = tempMax;
        toHere = fromHere.getNext();
    }
    return this;
}

enter image description here

2 个答案:

答案 0 :(得分:1)

一些提示:

  • 如果您想要最小的数字,那么current.getNext().getValue() > tempMax.getValue()应该有>而不是<

  • 如果第一个元素已经是最小值,那么您的代码也将失败,因为您尝试对null执行某些操作

  • 我也可以在这里看到重复的代码,current = current.getNext()。指针操作通常难以编码,编写更加清晰的代码坚持不要重复自己的原则可能会帮助你看到错误!

  • 如果您打印编译器/运行时错误消息,这将有助于此处的人员

答案 1 :(得分:1)

您的代码的主要问题是,当节点已经处于它应该的位置时,它会出错。如果我们执行:

5 -> 1 -> 2 -> 3-> 4

prev将为空,我们会崩溃。

如果我们这样做:

1 -> 4 -> 5 -> 3-> 2

在第一次迭代中获得

5 -> 4 -> 1 -> 3-> 2

到目前为止一切顺利。然后,在第二次迭代的循环之后

5 -> 4 -> 3-> 2 // prev仍然指向4,1消息

5 -> 4 -> 4 // tempMax = toHere so tempMax-&gt; tempMax,其他元素消失了

因此,表现形式prev在某种程度上无效。 有一个快速修复,比如在toHere最大时跳过重新定位, 但快速修复不是你需要的。你应该:

  • 重新思考一些特殊情况。空列表,一个元素,列表已经排序,列表反向排序,随机顺序,(重复元素??)
  • 为每个案例编写单元测试
  • 重写您的算法,并避免 哦,是的,我忘记了这个案例...... 。将其愚蠢,您只需要在每个给定步骤中使用此步骤中找到的最大值替换第一个元素。
  • 避免使用具有冗余信息的变量。例如,tempMax应始终是prev的下一个,因此仅prev就足够了。否则你会花脑细胞保持一致性。
  • 再次测试套件案例。