双链表上的冒泡排序

时间:2013-02-24 03:25:41

标签: java linked-list bubble-sort

在这里花了几个小时试图将冒泡排序的实现工作在双链表上。我的代码似乎适用于一次通过但是过早完成而没有完成排序。任何指导都将不胜感激。

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);
}

由于

3 个答案:

答案 0 :(得分: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实施中所做的所有样板代码。

答案 1 :(得分:0)

在外部循环的开头添加cur = head.getNext();可以很好地实现链表的实现。所以问题来自swap方法或列表的实现。

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

答案 2 :(得分:0)

你肯定需要将cur = head.getNext();保留在外部while循环的末尾,否则在第二次传递时,内部while循环将被完全跳过并且完成将为真。

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

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