Можно ли использовать алгоритм сортировки с нетранзитивным сравнением, и если да, почему транзитивность указана в качестве требования для сортировки компараторов?
Фон:
Алгоритм сортировки обычно сортирует элементы списка в соответствии с функцией сравнения C (x, y), с
Требования к этому компаратору, насколько я понимаю, следующие:
- рефлексивный:
- антисимметричный:
- переходный:
- C (x, y) определяется для всех x и y, а результаты зависят только от x и y
(Эти требования всегда перечислены по-разному в разных реализациях, поэтому я не уверен, что понял их правильно)
Теперь я задаюсь вопросом о «толерантной» функции компаратора, которая принимает числа x, y как похожие, если : C ( x , y ) = { - 1, если x < y - 1 0, если | х - у | ≤ 1 + 1, если x > y + 1
Примеры: оба [ 1, 2, 3, 4, 5]
и [1, 4, 3, 2, 5]
правильно отсортированы в порядке возрастания согласно толерантному компаратору ( если x стоит перед y в списке),
но [1, 4, 2, 3, 5]
это не так, поскольку C (4,2) = 1
Этот толерантный компаратор является рефлексивным и антисимметричным, но не транзитивным.
т.е. C (1,2) = 0, c (2,3) = 0, но C (1,3) = -1, нарушая транзитивность
Тем не менее, я не могу придумать ни одного алгоритма сортировки, который не смог бы произвести «правильно отсортированный» вывод при наличии этого компаратора и случайного списка.
Поэтому транзитивность в этом случае не требуется? И есть менее строгий вариант транзитивности , что является требуется для сортировки на работу?
Смежные вопросы:
- Почему антисимметрия необходима для сравнения? (об антисимметрии)
- Алгоритмы сортировки, которые принимают случайный компаратор (о случайном C (x, y))
- OrderBy с нетранзитивным IComparer (об алгоритме сортировки c #, мной)