【问题标题】:How can I check for stability in a sort of integers?如何检查某种整数的稳定性?
【发布时间】:2016-09-26 21:32:43
【问题描述】:

我正在开展一项活动,在该活动中,我必须确定在一组给定方法中使用哪种排序,我实际上无法查看它,因为它是从仅包含 .class 文件的 .jar 文件运行的。我能看到的只是时间信息(所以我可以根据时间复杂度确定它可能是什么类型)。但是,被排序的元素是随机生成的整数,并且允许重复。为了正确识别排序,我必须以某种方式识别哪些方法没有以稳定的方式排序——无法查看源代码或整数数组。例如,我可以有一个数组 [1,2,3,9,5,64,8,5,1],排序后将是 [1,1,2,3,5,8,9,64] .但是,如果使用类似不稳定选择排序的方法对此进行排序,则两个 1 值将按照彼此的相对顺序进行切换。我如何检测是否发生了这样的事情?

【问题讨论】:

  • “我怎样才能检测到是否发生过这样的事情?”如果您要排序的数组始终是 int[] 并且您不能在此方法中提供任何其他类型的数组,我担心您不能。
  • 反编译.class
  • 您打算如何区分插入排序和冒泡排序?还是介于快速排序和堆排序之间?
  • int[] 的排序并不能保证使用稳定的排序,因为没有必要,因为无法区分相等的值。

标签: java arrays sorting stability


【解决方案1】:

如果您受限于使用ints,则无法对此进行测试,因为无法区分两个不同的1s。

但是,如果您可以选择使用Integers,并且您专门使用new Integer()(而不是Java 自带的自动装箱),您可以将原始数组中的引用与新数组中的引用进行比较。

【讨论】:

  • 我该怎么做呢?我是否必须将两个数组都保存为整数数组?
  • @GrahamMcclelland - 我认为这里的想法是 Java 最终会有效地使用指向 Integers 的指针数组(对 Integer 对象的引用)。这在某种程度上违反了使用指针数组的约束。此外,它只能在指针以内存地址顺序开始时起作用,并且排序函数将对指针进行排序而不是对值进行排序(没有重新排列指针),并且有一些方法可以检查指针的值之后一种。
【解决方案2】:

正如 Joe C 所提到的,您必须使用某种包装类,因为无法确定两个原始值之间的差异。例如可以使用 Integer 类。

但是这里有一个更大的问题,那就是逻辑问题。仅仅因为排序算法不能保证是稳定的,并不意味着给定一个特定的输入它会不稳定。因此,衡量算法的不稳定性最终是确定正在使用哪种算法的不可靠方法。

您可以使用不稳定性来缩小潜在算法的范围,但首先我建议您关注不同算法处理不同类型输入所需的时间。从显而易见的算法时间复杂度开始:例如,bogosort 平均需要比快速排序更长的时间。然后深入研究您正在考虑的算法的内部工作原理。一些具有相同时间复杂性的算法(例如:mergesort 和 heapsort)都会根据您传递给它们的输入类型而表现不同。例如,一个处理完全反转的输入的速度可能非常慢,而另一个处理速度可能非常快。

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 2016-04-05
    • 2022-11-02
    • 2013-05-18
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    相关资源
    最近更新 更多