我有一个单独链接的列表,由于内存限制,我需要在恒定的空间中对其进行排序(换句话说,不应使用与列表中的项目数成比例的额外空间)。
链表的结构是:
head.item
=您要排序的有效负载;和head.next
=下一个项目。要求我建立另一个列表的恒定空间折扣解决方案,我需要就地进行。
我该怎么做?
答案 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)
一些方法:
O(n)
所以它应该非常快* *请注意,预期的运行时复杂度为O(n*n!)
答案 2 :(得分:1)
对于链接列表的就地排序,我建议合并排序。它很稳定,并且在NlgN时间内运行。