Czy można zastosować algorytm sortowania z nieprzechodnim porównaniem, a jeśli tak, dlaczego wymienność przechodni jest wymieniona jako wymóg dla sortujących komparatorów?
Tło:
Algorytm sortowania ogólnie sortuje elementy listy według funkcji komparatora C (x, y), przy pomocy
Wymagania dla tego komparatora są, o ile je rozumiem:
- zwrotny:
- antysymetryczny:
- przechodnie:
- C (x, y) jest zdefiniowane dla wszystkich x i y, a wyniki zależą tylko od x i y
(Te wymagania są zawsze wymienione inaczej w różnych implementacjach, więc nie jestem pewien, czy dobrze je zrozumiałem)
Teraz zastanawiam się nad „tolerancyjną” funkcją komparatora, która przyjmuje liczby x, y jako podobne, jeśli : C ( x , y ) = { - 1, jeśli x < y - 1 0, jeśli | x - y | ≤ 1 + 1, jeżeli x > y + 1
Przykłady: obydwa [ 1, 2, 3, 4, 5]
i [1, 4, 3, 2, 5]
prawidłowo sortowane w kolejności rosnącej zgodnie z porównawczy tolerancyjnej ( gdy X jest przed Y na liście)
, ale nie jest, ponieważ C (4,2) = 1[1, 4, 2, 3, 5]
Ten tolerancyjny komparator jest refleksyjny i antysymetryczny, ale nie przechodni.
tj. C (1,2) = 0, c (2,3) = 0, ale C (1,3) = -1, naruszając przechodniość
Jednak nie mogę wymyślić żadnego algorytmu sortowania, który nie dałby „poprawnie posortowanego” wyjścia, gdy otrzyma ten komparator i losową listę.
Czy zatem w tym przypadku przechodnie nie jest wymagane? Czy istnieje mniej ścisła wersja przechodniości, która jest wymagana, aby sortowanie działało?
Powiązane pytania:
- Dlaczego do sortowania porównawczego potrzebna jest antysymetria? (o antysymetrii)
- Algorytmy sortowania, które akceptują losowy komparator (około losowego C (x, y))
- OrderBy z nieprzechodnym IComparer (o moim algorytmie sortowania c #)