Algorithm 算法描述-是heapsort还是quicksort?

Algorithm 算法描述-是heapsort还是quicksort?,algorithm,Algorithm,我很难判断这个算法是heapsort还是quicksort 假设我有一个没有源代码的算法——它不稳定,在大型数据集上性能良好,在有序集和无序集上运行时间相似 如果没有更多信息,是否可以判断此算法是heapsort还是quicksort?我想说,从您拥有的数据中判断使用了什么算法几乎是不可能的 quicksort和heapsort都是不稳定的。而且它们都能很好地处理大的输入(the)。所以这两件事告诉我们几乎什么都没有 最后一条知识是关于排序输入的。快速排序是一种随机算法,因此排序输入在这里是不

我很难判断这个算法是heapsort还是quicksort

假设我有一个没有源代码的算法——它不稳定,在大型数据集上性能良好,在有序集和无序集上运行时间相似


如果没有更多信息,是否可以判断此算法是heapsort还是quicksort?

我想说,从您拥有的数据中判断使用了什么算法几乎是不可能的


quicksort和heapsort都是不稳定的。而且它们都能很好地处理大的输入(the)。所以这两件事告诉我们几乎什么都没有


最后一条知识是关于排序输入的。快速排序是一种随机算法,因此排序输入在这里是不相关的。heapsort的运行时间也是n logn,用于:

HEAPSORT在长度已为的数组上的运行时间 按递增顺序排序的是Θ(n lgn),因为即使它是 已经排序的文件将被转换回堆并进行排序

按排序的长度数组上HEAPSORT的运行时间 降序为Θ(n lgn)。这是因为即使 每次删除元素时,堆将以线性时间构建 而HEAPIFY被称为,它可以覆盖整个树的高度


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


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


p.S.感谢Ixanezis和Mooingduck指出现实世界中的快速排序并不是真正随机的。我不知道正确实现的快速排序是在常数数组(即所有元素都相同的数组)上以线性时间运行的。这是因为所有元素都将匹配轴,因此在将数组分为三部分的轴旋转步骤之后:
pivot)
左右部分将为空,快速排序将立即终止

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

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


这种方法还可以将heapsort与实现糟糕的快速排序实现区分开来!如果快速排序将数组分成三部分
(pivot)
,那么快速排序将需要O(n^2)时间,因为右侧部分将为空,左侧部分将包含n-1项。对10000000项数组进行排序将区分此错误的快速排序和heapsort--在现代机器上,heapsort将花费几秒钟,但执行不当的快速排序将花费数分钟。

您没有源代码,但您有执行代码可以。你可以阅读它,或者反编译它并读取反编译器的输出。这是一个测试中的问题吗?是的-这是一个旧的测试问题-因此纯粹的理论快速排序不一定是随机的。枢轴可以被选为一个范围内的中间元素。此外,它可以是一个中位数,我们可以在
O(n)
time中找到,从而提供
O(n log n)
quicksort的最坏情况时间。“quicksort是一种随机算法“我想我从未在野外见过这种算法的随机版本。它几乎总是完全确定的。然而,按照类似的思路,您可以尝试算法复杂性攻击,看看是否可以轰炸快速排序,这将证明它是一个快速排序。一个简单的方法是提供大量相同的值。大多数快速排序变成O(n^2)here@Ixanezis还有Mooingduck,谢谢你们两位的意见。我不知道,但看起来你是对的。但我仍然相信,从一次算法运行和OP的条件来看,是不可能猜测的。我同意,通常不可能知道使用哪种算法。使用中位数为3或中位数为5的快速排序,很难在数据集上运行,从而使实现表现出病态(即O(n^2))行为。但是,您可以相当容易地构造这样一个案例。有关详细信息,请参阅。几年前我们把它作为一个测试来实现。。。它使.NET这一类的软件崩溃了。(这是在.NET实现Introsort之前)。感谢您提供的详细信息。这或多或少证实了我的想法。。。但很高兴知道我从提供的信息中没有遗漏任何东西。