插入排序双重循环链表

时间:2012-10-18 01:33:28

标签: java linked-list circular-list

所以我试图让我的Doubly Linked List做一个insertSort

我现在遇到问题,只需将节点移动到适当位置即可。我已经进行了比较,但我的节点都没有移动。

public void insertionSort()
{
    Node temp;
    Node start = this.head.next;
    Node next = start.next;
    Node prev = this.head;

    while(start != this.head)
    {
        if(start.data.compareTo(next.data) > 0) //start is larger than next
        {
            temp = start;
            start = next;
            next = temp;
        }
        start = start.next;
        next = next.next;
        prev = prev.next;
    }
}

我想知道是否有人可以帮助我正确使用此算法。我正在使用循环双向链表来尝试测试各种排序例程以确保时间复杂度。

1 个答案:

答案 0 :(得分:0)

有趣的拼图!

我可以在您的算法中看到的主要问题是,您只能为插入的节点提供移动一个地方的机会。

插入排序从列表中的第二个节点到最后一个逐个查看,将它们向后交换,直到它们在前面已经排序的列表中排序。这可能需要几次交换,但是你的算法只允许一个(当你的if条件为真时)或零(当它为假时)。例如,假设我们正在排序:

b c a

start位于b和c时,您的插入排序会有效,然后它会移动到。在这里你说'如果a在c之前,用c'交换,给出:

b a c

...但是你的算法会终止。由于您需要为每个插入的节点执行不确定的交换次数,因此您需要另一个while循环。以下是插入排序算法的伪代码:

function insertion_sort(items) {
    while (i=1; i < items length; i++) { // for elements 1 to n
        while (j=i; j >= 0; j--) { // look backward through all previously sorted items
            if (items element at j < items element at j-1) {
                 swap element at j with element at j-1
            } else {
                break out of the loop
            }
        }
    }
}