Ist es möglich, einen Sortieralgorithmus mit einem nicht-transitiven Vergleich zu verwenden, und wenn ja, warum wird die Transitivität als Voraussetzung für das Sortieren von Komparatoren aufgeführt?
Hintergrund:
Ein Sortieralgorithmus sortiert im Allgemeinen die Elemente einer Liste nach einer Komparatorfunktion C (x, y) mit
Die Anforderungen an diesen Komparator sind, soweit ich sie verstehe:
- reflexiv:
- antisymmetrisch:
- transitiv:
- C (x, y) ist für alle x und y definiert und die Ergebnisse hängen nur von x und y ab
(Diese Anforderungen werden in den verschiedenen Implementierungen immer unterschiedlich aufgeführt, daher bin ich mir nicht sicher, ob sie in Ordnung sind.)
Jetzt wundere ich mich über eine "tolerante" Komparatorfunktion, die Zahlen x, y als ähnlich akzeptiert, wenn : C ( x , y ) = { - 1 wenn x < y - 1 0 wenn | x - y | ≤ 1 + 1, wenn x > y + 1
[ 1, 2, 3, 4, 5]
[1, 4, 3, 2, 5]
[1, 4, 2, 3, 5]
Dieser tolerante Komparator ist reflexiv und antisymmetrisch, aber nicht transitiv.
dh C (1,2) = 0, c (2,3) = 0, aber C (1,3) = -1, was die Transitivität verletzt
Ich kann mir jedoch keinen Sortieralgorithmus vorstellen, der mit diesem Komparator und einer zufälligen Liste keine "korrekt sortierte" Ausgabe erzeugen würde.
Ist in diesem Fall also keine Transitivität erforderlich? Und gibt es eine weniger strenge Version der Transitivität, die erforderlich ist , damit die Sortierung funktioniert?
Verwandte Fragen:
- Warum ist für die Vergleichssortierung eine Antisymmetrie erforderlich? (über Antisymmetrie)
- Sortieralgorithmen, die einen zufälligen Komparator akzeptieren (über ein zufälliges C (x, y))
- OrderBy mit einem nicht-transitiven IComparer (über den C # -Sortieralgorithmus , von mir)