Sorting 排序问题?
堆排序是“分而治之”排序还是优先级队列排序 另外,冒泡排序适合哪一类排序(恐怖排序除外)Sorting 排序问题?,sorting,heap,Sorting,Heap,堆排序是“分而治之”排序还是优先级队列排序 另外,冒泡排序适合哪一类排序(恐怖排序除外) 我已经读到堆排序通常被认为是“分而治之”排序,但它可以是优先级队列排序。严格地说是一个还是另一个?还是两者都有?我找不到任何关于泡沫类型的东西 我不认为HeapSort被认为是“分而治之”,因为该算法在任何时候都不会将问题细分为子问题。要执行HeapSort,算法将执行ExtractMin或ExtractMax,直到堆为空。这些操作是O(logn)因为在每次ExtractMin或ExtractMax之后,H
我已经读到堆排序通常被认为是“分而治之”排序,但它可以是优先级队列排序。严格地说是一个还是另一个?还是两者都有?我找不到任何关于泡沫类型的东西 我不认为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
应用了“分而治之”策略,但这是数据结构本身的事情,而不是算法
气泡排序是一种幼稚的算法 堆排序具有“分而治之”算法(如快速排序)的时间复杂性,但其行为与分而治之算法不同 因为它将数据分为“排序”部分和“未排序”部分,所以它实际上是一种选择排序。它利用堆数据结构在每一步从未排序列表中更有效地选择最小元素。因此,我想您可以说它是一种“优先级队列排序”,但应该提到的是,整个操作可以就地完成,而不是构建一个单独的堆 堆排序通常优于快速排序,除了快速排序的最坏情况复杂性为
O(N^2)
(而堆排序的最坏情况为O(N.logN)
)
冒泡排序也是一种就地算法,但它被认为是“幼稚的”。如上所述,堆排序绝对不是一种“分而治之”算法。堆排序使用堆数据结构对其元素进行有效排序。您可以将堆排序视为具有优先级队列的选择排序 分治算法具有以下特点: 1) 将任务划分为子任务,这些子任务是相同任务的较小实例 2) 递归求解子任务 3) 适当地结合结果
正如您所看到的,堆排序不符合这种类型的算法。唯一的相似之处是分治算法的结构反映了二叉树的结构(这通常是堆排序用来实现优先级队列的结构) 这是两个不同的问题,应该这样问。另外,请展示你的一些研究。好吧,我想他们都被归为同一个类别,这样他们可以一起被问到。冒泡排序将是一个“天真”的完美,这就是我需要知道的!很高兴知道!我忘了提到创建堆需要
O(n)
操作。但是仍然O(nlogn)
整个算法。谢谢你接受我的回答。如果给你一个未排序的数组,你如何首先构建堆?从未排序的数组构建堆可以使用分治算法在O(n)中完成。请看这里: