java,分类分析。 hepsort,QuickSort1,QuickSort2,Mergesort,给定一个BlackBox

问题描述 投票:0回答:1

I在Java上给了一个名为BlackBox.java的课程。此类中有四种类型的排序方法,它们称为Sort1,Sort2,Sort3和Sort4。鉴于我们有Mergesort,Heapsort,QuickSort,在数组中的第一名是枢轴(不使用stdrandom.shuffle),最后我们有了QuickSort,它将第一个和最后一个元素以中间为单位,并将其用作pivot(也将其用作pivot(也是不使用stdrandom.shuffle)。

问题是我需要找出哪种排序方法(sort1,sort2,sort3,sort4)是什么。我已经计算了500.000个整数的时间。首先,我使用的是随机排序输入,比定期分类的输入和使用输入分类的反向,最后我使用了一个非常大的输入,其中包含相同的整数,每个到处都有3个({3 3 3 3 3 3 3 ...})。有时我会堆叠溢出,有时没有。我也为所有这些都有非常相似的分类时间,我的意思是我无法使用它来告诉我正在使用哪种排序算法。

如何找出哪种算法是什么?我应该使用哪些方法?

P.S。我已经阅读了由Sedgewick和Wayne撰写的书算法中的第1.4章,并在Internet上进行了很多搜索。也许我不太了解第1.4章。因此,我请您在可以帮助我解决这个问题的情况下。

,也不允许我检查字节。

所有这些算法之间有3个主要差异:

订单保存(稳定/unstalbe)
java algorithm sorting black-box-testing
1个回答
0
投票
订单中,将不同的对象相互比较(或枢轴)

订单,在其中交换了不同的对象
  1. 要测试保留订单,您需要用一个属性对对象进行排序,然后将其分类为第二,例如:
  2. class item { int sortid; string name; compareTo(item) -> return compare(this.sortid, item.sortid); note that name is not used }
  3. SO,通过提供具有非唯一sortid的数组,但是您可以检查算法是否稳定,请注意 - 您需要使用多个输入来查看稳定性,因为即使是非稳定的输入也可以返回稳定订单:

Merge-稳定
 -heap-不稳定

Quick-不稳定

    快速实现快速实现将首先尝试将较小的对象移动到向左和更右键,因此,如果您发现您的元素与第一个元素进行了比较 - 它是枢轴的第一个实现,如果使用中间 - 它是第二个快速排序的实现
  • 要实施此功能,您需要通过自定义比较传递对象,哪些将检查它们与哪些元素进行比较,并且他们知道可以用作枢轴的元素,因此首先比较将为您回答哪个枢轴实际使用了哪种sorts方法
  • 在这一点上,很明显哪个是堆,但是如果您有能力监视元素掉期,也可以检测到堆,因为它开始首先放置最小/最大的元素。
  • 如果您能够测量运行时间,那么一种方法是为每种算法构建最佳和最差的输入,并查看哪些情况放慢了哪些情况,在哪些情况下进行了多少。

最简单的情况是QuickSort选择第一个元素作为枢轴;当数组已经按顺序或相反的顺序排列时,这会降低到二次时间。最好的情况可以通过确保枢轴始终是该子阵列中元素的中位数来构建。

下一个最简单的情况是使用数组的中间作为枢轴的QuickSort;对于某些输入,这同样会降低二次时间,但是构建此类输入要困难一些。最好的情况是,当数组已经按顺序或反向顺序排序时,因此中间元素始终是中位数。 在最坏的情况下,Merge排序仍然是O(n log n),但是在某些输入上的效果较慢。当一个数组中的所有元素小于另一个数组中的所有元素时,“合并”阶段进行最少的比较,而当两个数组尽可能“交错”时,最多的比较。 在最坏的情况下,Heapsort仍然是O(n log n),但同样可以更快或更慢,具体取决于每个元素必须“筛选”的距离。

使用自定义比较器在算法的内部工作中进行监视,该定制比较器以哪些顺序比较哪些元素,但我认为它更有可能是您的教授意图的解决方案。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.