首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算法描述-是堆排序还是快速排序?

算法描述-是堆排序还是快速排序?
EN

Stack Overflow用户
提问于 2016-06-21 22:16:26
回答 2查看 108关注 0票数 2

我不知道这个算法是堆排序还是快速排序.

假设我有一个没有源代码的算法--它是不稳定的,在大型数据集上性能很好,对于有序和无序的集合,运行时间类似。

如果没有更多的信息,是否可以判断这个算法是堆排序还是快速排序?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-21 23:05:12

我想说的是,从你的数据中判断出使用了什么算法是不可能的。

快速排序和堆排序都不稳定。此外,这两种方法都很好地处理大量输入( 常量并没有那么不同)。所以这两件事基本上没有告诉我们什么。

最后一项知识是关于分类输入的。快速排序是一种随机算法,因此排序输入在这里是不相关的。堆排序的运行时间也可用于两个方向的排序

HEAPSORT在已经按递增顺序排序的数组上的运行时间是Θ( even ),因为即使已经排序,它也将被转换回堆并排序。 HEAPSORT在按递减顺序排序的长度数组上的运行时间为Θ(n )。这是因为即使堆是在线性时间内构建的,每次删除元素并调用HEAPIFY时,它都可以覆盖树的全部高度。

我想猜测算法的唯一原因是利用快速排序的随机性。这意味着我将多次运行同一个数据集,并会看到执行时间的潜在波动(更糟糕的是O(n^2))。如果我没有发现任何显著的波动-这是堆排序,否则快速排序。

也许你会更幸运,如果你能分析它使用的内存。Heapsort需要O(1),好的快速排序需要O(logn)额外的内存,而朴素的需要O(n)。但你没有这些信息可供你使用。

P.S.多亏了 Ixanezis和Mooing鸭子指出在现实世界中快速排序并不是真正的随机化。我不知道但这是真的

票数 2
EN

Stack Overflow用户

发布于 2016-06-22 05:07:26

正确实现的快速排序在常量数组上以线性时间运行(即所有元素都相同的数组)。这是因为所有元素都将匹配支点,因此在将数组分成三个部分的旋转步骤之后:(< pivot)(= pivot)(> pivot),左和右部分将为空,而且快速排序将立即终止。

Heapsort没有这个属性:它总是在O(n log )中运行。

因此,为了区分这两者,我尝试对不断增加的大小的常量数组进行排序,并希望看到堆排序实现出现比线性更大的减速。

这种方法还可以区分堆排序和实现得不好的快速排序实现!如果快速排序将数组分成三个部分( (<= pivot)(pivot)(> pivot) ),则快速排序将占用O(n^2)时间,因为右侧部分将为空,而左侧部分将包含n-1项。排序一个10,000,000项数组将区分这个坏的快速排序和堆排序--堆排序在现代机器上需要几秒钟的时间,但是实现不好的快速排序将需要很多分钟。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37955490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档