【发布时间】:2011-12-26 18:22:50
【问题描述】:
我正在尝试在 C++ 中创建一个排序函数,该函数使用堆排序对链表对象进行排序,但我不知道如何开始。任何人都可以告诉我如何做到这一点吗?我什至不确定如何对链接列表进行排序
【问题讨论】:
标签: list sorting linked-list heap
我正在尝试在 C++ 中创建一个排序函数,该函数使用堆排序对链表对象进行排序,但我不知道如何开始。任何人都可以告诉我如何做到这一点吗?我什至不确定如何对链接列表进行排序
【问题讨论】:
标签: list sorting linked-list heap
Heapsort 通过从数据中构建 heap 来工作。只有在每个元素都有random-access 时,堆才能有效地构建。
第一步将创建一个指向列表对象的指针数组,以便您可以对数组执行通常的堆排序。
最后一步是将指针数组转换回链表。
一个更好的链表排序方法是insertion sort——尤其是因为您可以将排序作为链表实现的insert()函数的一部分来执行。
【讨论】:
我必须同意 sarnolds 的回答。由于多种原因,堆集链表效率极低,但首先是它们应该在初始放置时进行排序。也就是说,如果我要尝试,我会创建一个ArrayList<T> links 将所有链接加载到其中。然后,您可以将其成堆抓取并对其进行排序。完成后,只需从头开始重新加载链接列表。
【讨论】:
HeapSort 之所以好的有两个原因 -
1- 这是一种就地算法。
2- O(nlogn) 的时间复杂度
O(nlogn) 是因为数组的随机访问性质,但是如果你使用链表,那么你就不会获得数组的随机访问优势。 因此时间复杂度将变为 O(n^2)。这不利于排序。
我会推荐你对链表使用归并排序算法。
【讨论】: