我正在开展一项活动,在这项活动中,我必须确定在一组给定方法中使用了哪种类型,我实际上无法查看它,因为它是从仅包含.class文件的.jar文件运行的。我只能看到时间信息(所以我可以根据时间复杂度确定它的类型)。但是,被排序的元素是随机生成的整数,并且允许重复。为了正确识别排序,我必须以某种方式确定哪些方法没有以稳定的方式排序 - 无法查看源代码或整数数组。例如,我可以有一个数组[1,2,3,9,5,64,8,5,1],在排序时将是[1,1,2,3,5,8,9,64] 。但是,如果使用类似非稳定选择排序的东西对其进行排序,则两个1值将相对于彼此切换。我怎么能检测出这样的事情是否发生过?
答案 0 :(得分:2)
如果您被限制使用int
,则无法对此进行测试,因为无法区分两个不同的1
。
但是,如果您可以选择使用Integers
,并且专门使用new Integer()
(而不是Java附带的自动装箱),则可以将原始数组中的引用与新引用进行比较之一。
答案 1 :(得分:1)
如Joe C所述,您必须使用某种包装类,因为无法确定两个原始值之间的差异。例如,可以使用Integer类。
然而,这里有一个更大的问题,这是一个逻辑问题。仅仅因为排序算法不能保证稳定并不意味着给定特定输入它将是不稳定的。因此,测量算法的不稳定性最终是确定使用哪种算法的不可靠方式。
您可以使用不稳定性来缩小您的潜在算法范围,但是首先我建议您关注不同算法处理不同类型输入所需的时间。从明显的算法的时间复杂性开始:例如,bogosort平均需要比快速排序长得多。然后深入研究您正在考虑的算法的内部工作原理。一些具有相同时间复杂度的算法(例如:mergesort和heapsort)将根据您传入其中的输入类型而表现不同。例如,处理完全反转的输入可能非常慢,而另一个可能非常快速地执行此操作。