如何在恒定空间中对单个链表进行排序?

时间:2009-05-09 00:47:48

标签: c++ sorting linked-list

我有一个单独链接的列表,由于内存限制,我需要在恒定的空间中对其进行排序(换句话说,不应使用与列表中的项目数成比例的额外空间)。

链表的结构是:

  • head.item =您要排序的有效负载;和
  • head.next =下一个项目。

要求我建立另一个列表的恒定空间折扣解决方案,我需要就地进行。

我该怎么做?

3 个答案:

答案 0 :(得分:12)

在常量空间中对链表进行排序很容易,您只需调整指针即可。最简单的方法是使用仅交换相邻元素的排序算法。我将提供一个泡沫排序,只是因为你没有要求效率:

# Enter loop only if there are elements in list.

swapped = (head <> null)
while swapped:
    # Only continue loop if a swap is made.

    swapped = false

    # Maintain pointers.

    curr = head
    next = curr.next
    prev = null

    # Cannot swap last element with its next.

    while next <> null:
        # Swap if items in wrong order.

        if curr.item > next.item:
            # Notify loop to do one more pass.

            swapped = true

            # Swap elements (swapping head is special case).

            if curr == head:
                head = next
                temp = next.next
                next.next = curr
                curr.next = temp
                curr = head
            else:
                prev.next = curr.next
                curr.next = next.next
                next.next = curr
                curr = next
            endif
        endif

        # Move to next element.

        prev = curr
        curr = curr.next
        next = curr.next
    endwhile
endwhile

答案 1 :(得分:1)

一些方法:

  • 在列表中使用冒泡排序,如果列表很小,这应该足够快
  • 将列表复制到数组并使用heapsort或quicksort然后将其复制回来
  • 在列表中使用bogosort。最好的案例复杂性是O(n)所以它应该非常快*

*请注意,预期的运行时复杂度为O(n*n!)

答案 2 :(得分:1)

对于链接列表的就地排序,我建议合并排序。它很稳定,并且在NlgN时间内运行。