在这里花了几个小时试图将冒泡排序的实现工作在双链表上。我的代码似乎适用于一次通过但是过早完成而没有完成排序。任何指导都将不胜感激。
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);
}
由于
答案 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个列表进行排序需要多长时间?