堆排序是否被视为“分而治之”排序或优先级队列排序?
此外,泡泡排序适合哪种类型(除了可怕)。
我已经读过堆排序通常被认为是“分而治之”排序,但它可以是优先级队列排序。严格来说是一个还是另一个?或两者兼而有之?我找不到任何可以考虑泡泡排序的东西。
答案 0 :(得分:4)
我认为HeapSort
不被视为“分而治之”,因为算法不会将问题细分为子问题。要执行HeapSort算法执行ExtractMin
或ExtractMax
,直到堆为空。这些操作为O(logn)
,因为在每个ExtractMin
或ExtractMax
之后Heap
必须执行Heapify
以保留其部分顺序。最后的费用为O(nlogn)
,因为它n
ExtractMin
或ExtractMax
。
这是一个伪代码
HeapSort()
heap
new_ ordered_collection
while(heap.NotEmpty)
new_ ordered_collection.add(heap.ExtractMin)//or ExtractMax
heap.Heapify //could be MaxHeapify or MinHeapify
return new_ ordered_collection
请注意,ExtractMin
和ExtractMax
会弹出堆的最小或最大元素。
正如你所看到的,我没有看到“分而治之”的策略。
但是heap.Heapify
根据堆的部分顺序对元素进行重新排序。这个定义了每个节点和他的两个孩子之间的关系,因此,heap.Heapify
应用了“分而治之”策略,但这是DataStructre本身没有算法的事情。
冒泡排序是naive
算法。
答案 1 :(得分:0)
堆排序具有“分而治之”算法(例如快速排序)的时间复杂度,但它不像分而治之的算法。
因为它将数据拆分为“已排序”部分和“未排序”部分,所以它实际上是一种选择排序。它利用堆数据结构在每一步中更有效地从未排序列表中选择最小元素。我想你可以说这是一个'优先级队列排序',但是应该提到整个操作可以就地完成,而不是建立一个单独的堆。
堆排序通常优于quicksort,除了quicksort的最坏情况复杂度为O(N^2)
(与堆排序的最差情况O(N.logN)
相比)。
冒泡排序也是一种就地算法,但它被认为是“天真的”。
答案 2 :(得分:0)
如上所述,堆排序绝对不是" Divide and Conquer"算法。堆排序使用堆数据结构来有效地对其元素进行排序。您可以将堆排序视为具有优先级队列的选择排序。
划分和征服算法具有以下特征:
1)将任务分区为子任务,这些子任务是相同任务的较小实例 2)递归地解决子任务 3)适当地结合结果
正如您所见,堆排序不符合此类算法的条件。唯一的相似之处是分而治之算法的结构反映了二叉树的结构(通常是堆排序用于实现优先级队列的那种)。