小编典典

双链表上的QuickSort

java

我想在同步双向链接列表上实现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;
}


}

阅读 189

收藏
2020-11-26

共1个答案

小编典典

只是快速浏览一下,您的列表似乎不仅被双重链接,而且在末端连接在一起(因此它更像是环而不是列表)。换句话说,如果我要遍历您的列表(包含元素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


如果必须将其保留为环形,我仍将添加对列表的最后一个元素的引用,以便您可以说:

if(walker == in.last) break; // stop
2020-11-26