我在判断这个算法是heapsort还是quicksort时遇到了一些麻烦...
假设我有一个我没有源代码的算法 - 它不稳定,在大型数据集上性能良好,并且在有序和无序集合的类似时间内运行。
如果没有更多信息,是否可以判断此算法是heapsort还是quicksort?
答案 0 :(得分:2)
我想说,从你拥有的数据中分辨出使用的算法大多是不可能的。
quicksort和heapsort都不稳定。两者都处理很大的输入(constants are not that different)。所以这两件事大部分都没有告诉我们。
最后一条知识是关于排序输入。 Quicksort是一种随机算法,所以排序输入在这里是无关紧要的。 heapsort的运行时间也记录为both directions of sort:
HEAPSORT在长度数组上的运行时间 以递增顺序排序的是Θ(n lgn),因为即使它是 已排序后,它将被转换回堆并进行排序。
HEAPSORT在排序的长度数组上的运行时间 递减顺序为Θ(n lgn)。这是因为即使是 每次删除元素时,堆都将以线性时间构建 调用HEAPIFY,它可以覆盖树的整个高度。
我试图猜测算法的唯一原因是利用了快速排序的随机性。我的意思是,我会多次运行相同的数据集,并且会看到执行时间的潜在波动(更糟的情况是O(n^2)
)。如果我没有发现任何重大波动 - 这是heapsort,否则快速排序。
如果你可以分析它使用的内存,你可能会更幸运。 Heapsort需要O(1)
,其中好的快速排序需要O(logn)
额外的记忆而天真的需要O(n)
。但是你没有掌握这些信息。
<强> P.S。感谢 Ixanezis和Mooingduck指出现实世界中的快速排序并非真正随机化。我不知道but it is true
答案 1 :(得分:1)
正确实现的快速排序在常量数组(即所有元素相同的数组)上以线性时间运行。这是因为所有元素都与枢轴匹配,所以在旋转步骤之后将数组分成三个部分:(< pivot)(= pivot)(> pivot)
左右部分将为空,快速排序将立即终止。
Heapsort没有这个属性:它总是以O(n log n)运行。
因此,为了区分这两者,我会尝试对不断增加的大小的常量数组进行排序,并希望在heapsort实现中看到大于线性的减速。
这种方法还可以将heapsort与严格实施的quicksort实现区分开来!如果快速排序将数组分成三个部分(<= pivot)(pivot)(> pivot)
,则快速排序将花费O(n ^ 2)时间,因为右侧部分将为空,而左侧部分将具有n-1个项目它。对一个10,000,000个项目阵列进行排序可以将这个糟糕的快速排序与heapsort区分开来 - heapsort在现代机器上需要几秒钟,但是实施不当的快速排序需要很长时间。