【发布时间】:2016-02-14 17:26:20
【问题描述】:
自下而上的归并排序处理每个大小为 1 的元素的列表,并迭代地来回合并子列表,直到它们按排序顺序。这使得使用自下而上的合并排序对链表进行排序非常有吸引力,因为它们已经“分离”了。
我正在尝试用 C 语言实现自下而上的归并排序,并意识到有多种方法可以实现自下而上的归并排序;特别是,我正在使用这种方法:
- 将单个列表插入队列
- 出列前两个列表并合并它们
- 将合并列表排入队列(合并项目到最后)
- 重复步骤 1-3,直到它们按顺序排列
但是,我正在努力实现以下内容:
- 合并链表而不使用额外的 O(n) 空间(如果可能)
因此,我的问题是:
- 如何在 C 语言中正确实现? (特别是:重复出队和入队过程直到完全排序的处理)如何知道整个队列是否按排序顺序?我正在考虑跟踪列表中的 *head 指针。
- 在这种情况下归并排序稳定吗?为什么?
- 自底向上归并排序的运行时间仍然是O(nlogn)。但是,这种自下而上的归并排序是否使用 O(n) 空间?假设我们实现的链表已经是一个队列。
- 额外问题:有没有更好的替代方案来在链表上实现自下而上的归并排序?
我想这是在链表上使用自下而上合并排序的优势之一,因为它比在数组上使用自下而上合并排序更节省空间。如果我错了,请纠正我。
【问题讨论】: