Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 排序问题?_Sorting_Heap - Fatal编程技术网

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)中完成。请看这里: