是否可以将排序算法与非传递性比较一起使用?如果是,为什么将传递性列为排序比较器的要求?
背景:
排序算法通常根据比较器函数C(x,y)对列表的元素进行排序,其中
据我了解,此比较器的要求是:
- 自反:
- 反对称:
- 传递性:
- 为所有x和y定义C(x,y),并且结果仅取决于x和y
(这些要求在不同的实现中总是以不同的方式列出,因此我不确定我是否正确)
现在我想知道一个“容忍的”比较器函数,如果,则接受数字x,y相似。x − y | ≤ 1: Ç (X ,ÿ )= { - 1 ,如果 X < ý - 1 0 如果| x − y | ≤ 1 + 1 如果 X > ÿ + 1
实例:两者[ 1, 2, 3, 4, 5]
并[1, 4, 3, 2, 5]
根据比较宽容以升序排序正确(,如果x来在列表中在y之前)
,但不是,因为C(4,2)= 1[1, 4, 2, 3, 5]
这种宽容的比较器是自反的和不对称的,但不能传递。
即C(1,2)= 0,c(2,3)= 0,但是C(1,3)= -1,违反了传递性
但是,我无法想到在给定该比较器和随机列表的情况下不会产生“正确排序”输出的任何排序算法。
因此,在这种情况下是否不需要传递性?排序是否需要不太严格的传递性版本?
相关问题:
- 为什么要进行比较排序需要反对称?(关于反对称)
- 接受随机比较器(大约随机C(x,y))的排序算法
- 使用非传递性IComparer的OrderBy(关于c#排序算法,由我负责)