Чи можливо використовувати алгоритм сортування з неперехідним порівнянням, і якщо так, то чому транзитивність перерахована як вимога до сортування компараторів?
Фон:
Алгоритм сортування, як правило, сортує елементи списку відповідно до функції порівняння C (x, y), з
Наскільки я розумію їх вимоги до цього компаратора:
- рефлексивні:
- антисиметричний:
- C (x, y) визначається для всіх x і y, а результати залежать лише від x і y
(Ці вимоги завжди перераховані по-різному в різних реалізаціях, тому я не впевнений, що я їх все добре)
[ 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 #, мною)