Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,排序分析。Heapsort、QuickPort1、QuickPort2、Mergesort,给定一个黑盒_Java_Algorithm_Sorting_Black Box Testing - Fatal编程技术网

Java,排序分析。Heapsort、QuickPort1、QuickPort2、Mergesort,给定一个黑盒

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)是什么。我已经用输入

我得到了一个名为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章理解不够。所以,如果可以的话,我请求你帮我解决这个问题


此外,我不会大声检查字节码。

所有这些算法之间有三个主要区别:

  • 保序(稳定/非稳定)
  • 不同对象相互比较的顺序(或轴)
  • 交换不同对象的顺序
  • 要测试是否保留顺序,您需要使用一个属性对对象进行排序,并使用第二个属性对其进行区分,例如:

    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,所以我的输入是整数数组而不是整数数组。我想我需要检查一下字节码,看看你的一些想法是不是?在这个问题中,我没有大声检查字节码。