【问题标题】:Create a method to check if sorting algorithm is stable创建一个方法来检查排序算法是否稳定
【发布时间】:2020-02-05 03:07:18
【问题描述】:

我已经创建了不同的排序算法,但需要测试它们是否稳定或不使用 java - 我该怎么做?

【问题讨论】:

  • 测试可以证明一个不稳定的排序算法是不稳定的,但不能证明一个稳定的排序算法是稳定的。
  • 没错。您需要对此进行分析,而不是测试。
  • @WJS 不,只是想尽我所能提供帮助。

标签: java sorting


【解决方案1】:

首先,稳定排序是在排序完成后,测试为相等的元素在列表中保持相同的相对位置。

这是一种证明排序看起来稳定或不稳定的方法。

  1. 根据对象的排序标准创建随机化的对象列表。
  2. 保持相同的顺序,为每个对象添加一个sequential id。此 id 不应成为排序标准的一部分。
  3. 现在按升序顺序对它们进行排序。

现在您可以遍历排序列表并仅检查 相等 元素,查看 id 是否按升序排列。如果是,则该排序的行为类似于稳定排序。 如果不是,则它的行为类似于不稳定的排序

请注意,测试并不能保证稳定性,因为持续的稳定排序并不能保证未来的稳定排序。过去的结果不会影响未来的结果。

但是一个不稳定的结果证明排序是不稳定的。

注意:添加上面的 id 只是一种方法。相同元素的跟踪索引可能是另一个。这个想法是为了表明相等的元素保持在它们彼此的相对位置。

【讨论】:

  • 建议您使用 italicbold 来强调。使用code 强调的是......不是房子的风格。 (顺便说一下+1)
【解决方案2】:

测试排序稳定性:

  • 创建 2 个(或更多)不同但比较相等的对象。
  • 将它们添加到列表中。
  • 将它们添加到另一个列表,但顺序相反。
  • (可选)在“相等”对象之前/之后/之间添加其他对象。
  • 对两个列表进行排序。

如果“相等”对象的顺序保持在插入顺序中,那么排序很可能是稳定的。这不是 100% 的保证,但对多个不同长度的列表进行排序会提高测试的置信度。

例子

class StringNum implements Comparable<StringNum> {
    private final String s;
    private final int n;
    public StringNum(String s, int n) {
        this.s = s;
        this.n = n;
    }
    @Override
    public int compareTo(StringNum that) {
        return this.s.compareTo(that.s); // Only order by string, not by number
    }
    @Override
    public String toString() {
        return this.s + ":" + this.n;
    }
}
StringNum a1 = new StringNum("A", 1);
StringNum b1 = new StringNum("B", 1);
StringNum b2 = new StringNum("B", 2);
StringNum c1 = new StringNum("C", 1);
StringNum c2 = new StringNum("C", 2);
StringNum c3 = new StringNum("C", 3);
StringNum d1 = new StringNum("D", 1);
StringNum d2 = new StringNum("D", 2);
StringNum d3 = new StringNum("D", 3);
StringNum d4 = new StringNum("D", 4);
StringNum e1 = new StringNum("E", 1);
StringNum e2 = new StringNum("E", 2);
StringNum e3 = new StringNum("E", 3);
StringNum e4 = new StringNum("E", 4);
StringNum e5 = new StringNum("E", 5);
List<StringNum> list1 = new ArrayList<>(Arrays.asList(a1, b1, c1, d1, e1, b2, c2, d2, e2, c3, d3, e3, d4, e4, e5));
List<StringNum> list2 = new ArrayList<>(Arrays.asList(e5, e4, e3, e2, e1, d4, d3, d2, d1, c3, c2, c1, b2, b1, a1));
Collections.sort(list1);
Collections.sort(list2);
System.out.println(list1);
System.out.println(list2);

输出

[A:1, B:1, B:2, C:1, C:2, C:3, D:1, D:2, D:3, D:4, E:1, E:2, E:3, E:4, E:5]
[A:1, B:2, B:1, C:3, C:2, C:1, D:4, D:3, D:2, D:1, E:5, E:4, E:3, E:2, E:1]

由于两个列表都按字母正确排序,第一个列表保持插入的数字升序,第二个列表保持插入的数字降序,我们可以得出结论Collections.sort()似乎是稳定的。

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 2010-09-13
    • 2012-05-16
    • 2015-02-25
    • 1970-01-01
    • 2015-10-12
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多