0

花了几个小时试图让冒泡排序的实现在双链表上工作。我的代码似乎可以通过一次,但在没有完成排序的情况下过早完成。任何指导将不胜感激。

public void bubbleSort()
{
    Node cur = head.getNext();
    boolean done = false;

    while (!done)
    {
        done = true;
        while(cur != tail)
        {
            if (cur.getNext().getCount()>cur.getCount())
            {
                swap(cur.getNext(),cur);
                done=false;
            }
            cur = cur.getNext();
        }
    }
} 

我使用的交换方法似乎破坏了节点的放置,直到它成为两个节点之间的循环。

private void swap(Node n1, Node n2)
{
    Node b1, b2, a1, a2;
    System.out.println("Swapping n1: " + n1 + " with n2: " + n2);
    b1 = n2.getPrev();
    if (b1 == n1) // handle adjacent nodes
        b1 = n2;
    a1 = n2.getNext();

    b2 = n1.getPrev();
    if (b2 == n2) // handle adjacent nodes
        b2 = n1;
    a2 = n1.getNext();

    // swap

    n1.setPrev(b1);
    n1.setNext(a1);

    n2.setPrev(b2);
    n2.setNext(a2);

    b1.setNext(n1);
    a1.setPrev(n1);

    b2.setNext(n2);
    a2.setPrev(n2);
}

谢谢

4

3 回答 3

1

我在您的代码中看到的问题:

  • 您应该从 开始head,而不是从head.getNext().
  • 您应该Node cur在每次while(!done)迭代时重新开始。

通过这些更改,您的代码应该是

public void bubbleSort() {
    boolean done = false;
    while (!done) {
        Node cur = head;
        done = true;
        while(cur != tail) {
            if (cur.getNext().getCount()>cur.getCount()) {
                swap(cur.getNext(),cur);
                done=false;
            }
            cur = cur.getNext();
        }
    }
}

此代码假定您的swap方法没有问题。使用int count作为您Node班级中的数据进行测试,在列表中分配 10000 个 int 值。


编辑:根据您的问题编辑,我的Node课程和swap功能如下:

private static class Node {
    int count;
    Node next;
    //getters and setters...
}

//this function just swaps data, no need to swap the nodes prev and next
//(note that yours is an algorithm design issue)
private void swap(Node node1, Node node2) {
    int aux = node1.getCount();
    node1.setCount(node2.getCount());
    node2.setCount(aux);
}

无需执行您在swap实现中完成的所有样板代码。

于 2013-02-24T05:46:34.840 回答
0

在外循环的开头添加cur = head.getNext();对于我的链表实现来说很好。所以问题出在swap列表的方法或实现上。

根据你的bubbleSort方法,该swap方法只交换节点的数据,而不是节点本身。我的意思是,它只是交换 的值count。如果不是这样,swap方法就是问题。否则,您的双链表实现会出现问题。

于 2013-02-24T03:44:59.543 回答
0

您肯定需要保持cur = head.getNext();在外部 while 循环的末尾,否则在第二次通过时,内部 while 循环将被完全跳过并且 done 将是真的。

您是否考虑过冒泡排序的运行时间?我在您对 MD.Unicorn 的回答中注意到,它适用于 <100 的列表,但不适用于 1000 的列表。1000 的预期运行时间列表至少比小于 100 的列表慢 100 倍。您可能不会给它足够的时间来完成。

对 100 个列表进行排序需要多长时间?

于 2013-02-24T05:44:16.810 回答