Java,排序分析。Heapsort、QuickPort1、QuickPort2、Mergesort,给定一个黑盒
我得到了一个名为BlackBox.Java的Java类。这个类中有四种类型的排序方法,它们被称为sort1、sort2、sort3和sort4。假设我们有Mergesort、Heapsort、Quicksort,数组中第一个位置作为枢轴(不使用StdRandom.shuffle),最后我们有Quicksort,它将第一个和最后一个元素的中间部分作为枢轴(也不使用StdRandom.shuffle) 问题是我需要找出哪种排序方法(sort1、sort2、sort3、sort4)是什么。我已经用输入的500.000个整数计算了时间。首先我使用随机顺序输入,然后使用规则排序的输入,然后使用反向排序的输入,最后我使用了一个非常大的输入,具有相同的整数,到处都是3({3…})。有时我得到堆栈溢出,有时没有。我也得到了非常相似的排序时间,我的意思是非常相似,我不能用它来告诉我使用的排序算法 我怎样才能知道哪个算法是什么?我应该用什么方法 另外,我已经读过Sedgewick和wayne写的《算法》一书中的第1.4章,并且在互联网上做了很多搜索。也许我对第1.4章理解不够。所以,如果可以的话,我请求你帮我解决这个问题Java,排序分析。Heapsort、QuickPort1、QuickPort2、Mergesort,给定一个黑盒,java,algorithm,sorting,black-box-testing,Java,Algorithm,Sorting,Black Box Testing,我得到了一个名为BlackBox.Java的Java类。这个类中有四种类型的排序方法,它们被称为sort1、sort2、sort3和sort4。假设我们有Mergesort、Heapsort、Quicksort,数组中第一个位置作为枢轴(不使用StdRandom.shuffle),最后我们有Quicksort,它将第一个和最后一个元素的中间部分作为枢轴(也不使用StdRandom.shuffle) 问题是我需要找出哪种排序方法(sort1、sort2、sort3、sort4)是什么。我已经用输入
此外,我不会大声检查字节码。所有这些算法之间有三个主要区别:
class item {
int sortid;
string name;
compareTo(item) -> return compare(this.sortid, item.sortid); note that name is not used
}
因此,通过提供具有非唯一sortid但名称不同的数组,您可以检查算法的稳定性,注意-您需要使用多个输入来查看稳定性,因为即使是不稳定的输入也可能返回稳定顺序:
- 合并稳定
- 堆-不稳定
- 快速-不稳定
在这一点上,很明显哪一个是heap,但是如果您能够监视元素交换,您也可以检测heap,因为它开始将最小/最大的元素放在第一位,如果您能够测量运行时间,然后,一种方法是为每个算法构造最佳和最坏情况的输入,并查看哪些算法在哪些情况下慢了,慢了多少
- 最简单的情况是快速排序,选择第一个元素作为轴心;当数组已经按顺序排列或按相反顺序排列时,这将退化为二次时间。最好的情况可以通过确保轴始终是该子阵列中元素的中位数来构造
- 下一个最简单的例子是使用数组中间作为轴心的快速排序;对于某些输入,这同样会退化为二次时间,但构造这样的输入有点困难。最好的情况是当数组已经按顺序或按相反顺序排列时,因此中间元素始终是中间元素
- 在最坏的情况下,合并排序仍然是O(n logn),但在某些类型的输入上,合并排序速度较慢。当一个数组中的所有元素少于另一个数组中的所有元素时,“合并”阶段进行的比较最少,当两个数组尽可能“交错”时进行的比较最多
- 在最坏的情况下,Heapsort仍然是O(n logn),但同样地,根据每个元素“筛选”的距离,Heapsort可以更快或更慢
这可能比使用自定义比较器监视算法的内部工作更加困难,该比较器记录哪些元素按什么顺序进行比较,但我认为这更可能是您的教授想要的解决方案。这些方法是对整数还是对象进行排序的?这些方法使用java中的comparable,所以我的输入是整数数组而不是整数数组。我想我需要检查一下字节码,看看你的一些想法是不是?在这个问题中,我没有大声检查字节码。