我在Java中得到了一个名为BlackBox.java的类。这个类中有四种排序方法,它们称为sort1、sort2、sort3和sort4。给出了Mergesort、Heapsort、Quicksort在数组中的第一个位置作为枢轴(不使用StdRandom.shuffle),最后给出了使用第一个和最后一个元素中间的快速排序作为枢轴(也不使用StdRandom.shuffle)。
问题是,我需要找出哪种排序方法(sort1、sort2、sort3、sort4)是什么。我已经计算了输入500.000个整数的时间。首先,我使用了随机有序的输入,而不是使用有规则排序的输入,而不是使用反向排序的输入,最后,我使用了一个具有相同整数的非常大的输入,3无处不在({3,3,3,3…})。有时我有堆栈溢出,有时没有。我也得到了非常相似的排序时间,我的意思是非常相似,我无法用它来判断我使用的排序算法。
我怎样才能找出哪种算法是什么?我该用什么方法?
附注:我已经读过塞奇威克和韦恩写的“算法”第1.4章,并在互联网上做了大量的搜索工作。也许我对第1.4章的理解不够。所以,如果可以的话,我请你帮我解决这个问题。
此外,我也没有大声检查字节码。
发布于 2020-02-20 16:15:17
所有这些算法之间有三个主要区别:
保持(stable/unstalbe)
。
为了测试保持顺序,您需要使用一个属性对对象进行排序,第二个属性来区分它们,例如:
class item {
int sortid;
string name;
compareTo(item) -> return compare(this.sortid, item.sortid); note that name is not used
}因此,通过提供具有非唯一排序的数组,但是不同的名称,您可以检查算法的稳定性,注意-您需要使用多个输入来查看稳定性,因为即使是非稳定的输入也可能返回稳定的顺序:
快速排序的不同实现将首先尝试将对象移动到较小的对象(从左转到右),因此如果您发现您的元素与第一个元素(如果是中间的话)是第一个实现,那么它就是快速排序的第二个实现。
要实现这一点,您需要传递具有自定义比较的对象,这将检查比较对象的元素,并且它们知道什么可以用作枢轴,所以第一次比较将给出哪种排序方法实际使用哪个枢轴。
此时,可以清楚地知道哪一个是堆,但是如果您有能力监视元素交换,您也可以检测堆,因为它首先开始放置最小/最大的元素。
发布于 2020-02-20 17:40:48
如果您能够测量运行时间,那么一种方法是为每种算法构造最佳和最坏的输入,并查看哪些算法在哪种情况下减慢了运行速度,以及降低了多少。
这可能比使用自定义比较器监视算法的内部工作更困难,该比较器记录哪些元素按什么顺序进行比较,但我认为这更有可能是您的教授想要的解决方案。
https://stackoverflow.com/questions/60323892
复制相似问题