Java 创建一个方法来检查排序算法是否稳定

Java 创建一个方法来检查排序算法是否稳定,java,sorting,Java,Sorting,我创建了不同的排序算法,但需要测试它们是否稳定,是否使用java–我该怎么做?首先,稳定排序是指在排序完成后,测试为相等的元素在列表中保持相同的相对位置 这里有一种方法可以证明排序是稳定的还是不稳定的 创建一个对象列表,这些对象根据其排序标准进行随机排序 保持相同的顺序,为每个对象添加一个顺序id。该id不应成为排序标准的一部分 现在按升序对它们进行排序 现在,您可以运行排序列表,只检查equal元素,查看ID是否按升序排列。如果是,则排序的行为类似于稳定排序。 如果不是,则其行为类似于不稳定排

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

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

这里有一种方法可以证明排序是稳定的还是不稳定的

  • 创建一个对象列表,这些对象根据其排序标准进行随机排序
  • 保持相同的顺序,为每个对象添加一个顺序id。该id不应成为排序标准的一部分
  • 现在按升序对它们进行排序
  • 现在,您可以运行排序列表,只检查equal元素,查看ID是否按升序排列。如果是,则排序的行为类似于稳定排序。 如果不是,则其行为类似于不稳定排序

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

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


    注意:添加上面的id只是一种方法。追踪相等元素的指数可能是另一种情况。这样做的目的是显示相等的元素彼此保持相对位置。

    要测试排序稳定性:

    • 创建两个(或更多)不同但比较相等的对象
    • 将它们添加到列表中
    • 将它们添加到另一个列表中,但顺序相反
    • (可选)在“相等”对象之前/之后/之间添加其他对象
    • 对两个列表进行排序
    如果“相等”对象的顺序保持在插入顺序,则排序很可能是稳定的。这不是100%的保证,但对不同长度的多个列表进行排序可以提高测试的置信度

    范例


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

    测试可以表明不稳定的排序算法是不稳定的,但并不是说一个稳定的排序算法是稳定的。您需要对此进行分析,而不是测试。@WJS没有,只是想尽我所能提供帮助。建议您使用斜体或粗体作为重点。使用
    code
    强调是。。。不是房子的风格。(+1顺便说一下)
    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]