【发布时间】:2020-02-05 03:07:18
【问题描述】:
我已经创建了不同的排序算法,但需要测试它们是否稳定或不使用 java - 我该怎么做?
【问题讨论】:
-
测试可以证明一个不稳定的排序算法是不稳定的,但不能证明一个稳定的排序算法是稳定的。
-
没错。您需要对此进行分析,而不是测试。
-
@WJS 不,只是想尽我所能提供帮助。
我已经创建了不同的排序算法,但需要测试它们是否稳定或不使用 java - 我该怎么做?
【问题讨论】:
首先,稳定排序是在排序完成后,测试为相等的元素在列表中保持相同的相对位置。
这是一种证明排序看起来稳定或不稳定的方法。
现在您可以遍历排序列表并仅检查 相等 元素,查看 id 是否按升序排列。如果是,则该排序的行为类似于稳定排序。 如果不是,则它的行为类似于不稳定的排序。
请注意,测试并不能保证稳定性,因为持续的稳定排序并不能保证未来的稳定排序。过去的结果不会影响未来的结果。
但是一个不稳定的结果证明排序是不稳定的。
注意:添加上面的 id 只是一种方法。相同元素的跟踪索引可能是另一个。这个想法是为了表明相等的元素保持在它们彼此的相对位置。
【讨论】:
code 强调的是......不是房子的风格。 (顺便说一下+1)
测试排序稳定性:
如果“相等”对象的顺序保持在插入顺序中,那么排序很可能是稳定的。这不是 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()似乎是稳定的。
【讨论】: