我正在尝试实现一个快速排序来对循环链接列表进行排序!
有一个DoublyLinkedList
包含ListElements
.
有ListElement
元素优先,它引用了它的前任和继任者。
例如DoubleLinkyedList
in 包含第ListElement
一个。First 可以通过 first.prev 或 first.next 引用。
链表中的最后一个元素引用了第一个元素,例如last = first.prev
;
我的问题是,我不断收到错误,但我不知道究竟是哪一个,因为它就像一个永无止境的循环,终端没有打印精确的异常。
我实现排序操作的类 Sorter.java 的代码:
package ads1ss13.pa;
public class Sorter {
public DoublyLinkedList quicksort(DoublyLinkedList in, int numOfElements) {
System.out.println("STARTE sort() in quicksorT()");
in = Sort(in, in.first.getId(), in.first.prev.getId());
return in;
}
public DoublyLinkedList Sort(DoublyLinkedList in, int l, int r)
{
System.out.println("Sort()");
l = in.first.getId();
r = in.first.prev.getId();
ListElement pivot = null;
System.out.println("l: "+l+"; r: "+r);
if(l < r)
{
pivot = in.first.prev;
}
System.out.println("pivot: "+pivot);
System.out.println("Ausfuehren der Partition mit l, r, pivot");
int p = Partition(in, l, r, pivot);
System.out.println("Ausgabe aus Partition p: "+p);
System.out.println("Ausführen der Sort() mit l und p-1 für r");
Sort(in, l, p-1);
System.out.println("Ausführen der Sort() mit p+1 für l, und r");
Sort(in, p+1, r);
return in;
}
public int Partition(DoublyLinkedList in, int l, int r, ListElement pivot)
{
System.out.println("Partition()");
int i = l;
int j = r;
ListElement r_ListElement = in.first.prev;
ListElement i_element = in.first.next;
ListElement j_element = pivot;
System.out.println("i: "+i+"; j: "+j+", pivot: "+j_element);
do {
do {
i = i + 1;
i_element = i_element.next;
} while (i_element.getKey() < pivot.getKey());
do {
j = j - 1;
j_element = j_element.prev;
} while (j > i || j_element.getKey() > pivot.getKey());
if(i_element.getKey() < j_element.getKey())
{
swap(in, i_element, j_element);
}
} while (i < j);
swap(in, i_element, r_ListElement);
return i;
}
public void swap(DoublyLinkedList in, ListElement links, ListElement rechts)
{
if(links.next.getId()==rechts.getId()){
ListElement Lprev = links.prev;
ListElement Rnext = rechts.next;
Lprev.next=rechts;
rechts.prev=Lprev;
links.next=Rnext;
Rnext.prev=links;
links.prev=rechts;
rechts.next=links;
}
else if(rechts.next.getId()==links.getId())
{
swap(in, rechts, links);
}
else
{
ListElement Lprev=links.prev;
ListElement Lnext = links.next;
links.next=rechts.next;
links.prev=rechts.prev;
rechts.next=Lnext;
rechts.prev=Lprev;
links.prev.next=links;
links.next.prev=links;
rechts.prev.next=rechts;
rechts.next.prev=rechts;
}
if(in.first.getId()==links.getId())
{
in.first = rechts;
}
else if(in.first.getId()==rechts.getId())
{
in.first = links;
}
}
}
你知道为什么我的代码永远不会切换到第二个递归调用sort()
以及返回哪个错误吗?