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

时间:2016-06-21 22:16:26

标签: algorithm

我在判断这个算法是heapsort还是quicksort时遇到了一些麻烦...

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

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

2 个答案:

答案 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在现代机器上需要几秒钟,但是实施不当的快速排序需要很长时间。