我想在同步双向链接列表上实现QuickSort算法。我给函数“ partition”添加了左右边界,然后它开始在左侧搜索较低的值,并在右侧搜索较大的值。之所以可行,是因为我的枢轴元素始终是最右侧的元素,并且在此步骤之后它位于中间。
我总是无休止的循环,我不知道为什么?也许错误的中止条件?
她我的代码:
private void quickSortRec(DoublyLinkedList in, ListElement l, ListElement r) { ListElement pivot = partition(in, l, r); if(pivot!=null && l!=r){ quickSortRec(in, in.first, pivot.prev); quickSortRec(in, pivot.next, in.first.prev); } } public ListElement partition(DoublyLinkedList in, ListElement l, ListElement r){ ListElement pivot = r; ListElement walker = l; if(l!=r){ while(walker != pivot){ if(walker.getKey() >= pivot.getKey()){ System.out.println(walker.getKey()); if(walker.prev == r){ l = walker.next; r = walker; } else{ ListElement h1 = walker.prev; ListElement h2 = walker.next; h1.next = h2; h2.prev = h1; walker.prev = pivot; walker.next = l; pivot.next = walker; l.prev = walker; r = walker; } } walker = walker.next; } if(l.prev == r) in.first = l; ListElement p = in.first; do{ System.out.print(p.toString()+" "); p = p.next; }while(p != in.first); System.out.println(); return pivot; } return null; } }
只是快速浏览一下,您的列表似乎不仅被双重链接,而且在末端连接在一起(因此它更像是环而不是列表)。换句话说,如果我要遍历您的列表(包含元素A, B, C, D),则不会是:
A, B, C, D
A -> B -> C -> D -> stop
相反,它将是
A -> B -> C -> D -> A -> B -> C -> D -> A -> B ..... etc.
我怀疑这可能就是为什么您遇到无限循环的原因。
我将创建对DoublyLinkedList类中列表的最后一个元素的引用(示例:)in.last,使用它来获取最后一个元素,并使第一个和最后一个元素链接到任一null或某种NullListElement extends ListElement
DoublyLinkedList
in.last
null
NullListElement extends ListElement
如果必须将其保留为环形,我仍将添加对列表的最后一个元素的引用,以便您可以说:
if(walker == in.last) break; // stop