전이가 아닌 비교와 함께 정렬 알고리즘을 사용할 수 있습니까? 그렇다면 전이성이 정렬 비교기의 요구 사항으로 나열되는 이유는 무엇입니까?
배경:
정렬 알고리즘은 일반적으로 비교기 함수 C (x, y)에 따라 목록의 요소를 정렬합니다.
이 비교기의 요구 사항은 내가 이해하는 한 다음과 같습니다.
- 재귀 :
- 비대칭 :
- 전이 :
- C (x, y)는 모든 x와 y에 대해 정의되며 결과는 x와 y에만 의존합니다.
(이러한 요구 사항은 구현마다 다르게 다르게 나열되므로 모든 요구 사항이 확실하지 않습니다)
지금 나는 경우 번호가 유사한로, Y를 X 받아들이는 "허용"비교 기능에 대해 궁금 : C ( X , Y ) = { - 1 의 경우 , X < Y - 1 0 의 경우 | x − y | ≤ 1 + 1 의 경우 , X > Y + 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 # 정렬 알고리즘에 대해)