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)
订单,在其中交换了不同的对象
class item {
int sortid;
string name;
compareTo(item) -> return compare(this.sortid, item.sortid); note that name is not used
}
Merge-稳定
-heap-不稳定
Quick-不稳定
最简单的情况是QuickSort选择第一个元素作为枢轴;当数组已经按顺序或相反的顺序排列时,这会降低到二次时间。最好的情况可以通过确保枢轴始终是该子阵列中元素的中位数来构建。
下一个最简单的情况是使用数组的中间作为枢轴的QuickSort;对于某些输入,这同样会降低二次时间,但是构建此类输入要困难一些。最好的情况是,当数组已经按顺序或反向顺序排序时,因此中间元素始终是中位数。 在最坏的情况下,Merge排序仍然是O(n log n),但是在某些输入上的效果较慢。当一个数组中的所有元素小于另一个数组中的所有元素时,“合并”阶段进行最少的比较,而当两个数组尽可能“交错”时,最多的比较。 在最坏的情况下,Heapsort仍然是O(n log n),但同样可以更快或更慢,具体取决于每个元素必须“筛选”的距离。使用自定义比较器在算法的内部工作中进行监视,该定制比较器以哪些顺序比较哪些元素,但我认为它更有可能是您的教授意图的解决方案。