CYCLIC LINKED LIST をソートするためのクイックソートを実装しようとしています!
DoublyLinkedList
を含む がありますListElements
。
にはListElement
Element First があり、その前身と後継者への参照があります。
たとえば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;
}
}
}
私のコードが2回目の再帰呼び出しに切り替わらない理由sort()
と、どのエラーが返されるのか分かりますか?