토너먼트 정렬
Tournament sort| 클래스 | 정렬 알고리즘 |
|---|---|
| 데이터 구조 | 배열 |
| 최악의 경우 공연 | O(n log n) |
| 평균 공연 | O(n log n) |
토너먼트 정렬은 정렬 알고리즘이다.우선순위 대기열을 사용하여 정렬에서 다음 요소를 찾음으로써 순진한 선택을 개선한다.순진한 선택 분류에서, n 요소의 다음 요소를 선택하기 위해서는 O(n) 작업이 필요하고, 토너먼트 분류에서는 O(log n) 운영이 필요하다(O(n)로 초기 토너먼트를 구축한 후).토너먼트 종류는 힙스포트의 변형이다.
공통적용
토너먼트 대체 선택 정렬은 외부 정렬 알고리즘의 초기 실행을 수집하는 데 사용된다.개념적으로 외부 파일을 읽고 그 요소를 대기열이 가득 찰 때까지 우선순위 대기열로 밀어 넣는다.그런 다음 최소 요소를 대기열에서 뽑아 첫 번째 실행의 일부로 기록한다.다음 입력 요소를 읽고 큐에 밀어넣고, min을 다시 선택하여 실행에 추가한다.대기열에 밀어넣는 새 요소가 실행에서 마지막으로 추가된 요소보다 작을 경우 요소의 정렬 값이 증가하므로 다음 실행의 일부가 된다는 작은 트릭이 있다.평균적으로 실행은 우선 순위 대기열의 용량보다 100% 길다.[1]
토너먼트 정렬은 N-way 병합에도 사용될 수 있다.
어원
양면전에 나서는 선수(또는 팀)가 많은 단일 엘리미네이션 토너먼트와 유사하다는 데서 유래한 이름이다.매 경기마다 선수들을 비교하고, 우승한 선수는 다음 레벨에서 경기를 치르도록 승격된다.결승전이 최종 승자를 결정할 때까지 서열은 계속된다.토너먼트는 최고의 선수를 결정하지만, 결승전에서 패배한 선수는 2등이 아닐 수도 있다. 그는 우승자가 준 다른 선수들에 비해 열세일 수도 있다.
실행
다음은 Stephanov와 Kershenbaum의 Scheme 코드를 바탕으로 Haskell에서 토너먼트 종류를 구현한 것이다.[2]
수입하다 데이터.트리 -- 스테파노프와 케르센바움 보고서의 TOURNAMENT-SORT!에서 각색한 것. 토너먼트 소트 :: 서드 t => [t] --^ 입력: 정렬되지 않은 목록 -> [t] -- ^ 결과: 입력의 정렬된 버전 토너먼트 소트 앨리스트 = 가다 (순수의<$$BODY$$gt;앨리스트) -- 먼저 각 원소를 단나무 숲으로 포장하십시오. 어디에 가다 [] = [] 가다 나무들 = (rootLabel 승자) : (가다 (하위 포리스트 승자)) 어디에 승자 = playTournament 나무들 -- 스테파노프와 케르센바움 보고서의 TOURNAMENT!에서 각색됨. playTournament :: 서드 t => 숲 t --^ 입력 포리스트 -> 나무 t -- ^ 입력에서 마지막으로 승격된 트리 playTournament [나무] = 나무 playTournament 나무들 = playTournament (플레이 라운드 나무들 []) - 스테파노프·케르센바움 보고서의 TOURNAMENT-RUND!를 각색한 작품 플레이 라운드 :: 서드 t => 숲 t - ^ 아직 라운드에 출전하지 않은 나무 숲 -> 숲 t - ^ 라운드에서 승리한 나무의 숲 -> 숲 t -- ^ 출력: 승격 버전을 포함하는 포리스트 - 게임에서 우승한 나무들 중에서. 플레이 라운드 [] 끝냈다 = 끝냈다 플레이 라운드 [나무] 끝냈다 = 나무:끝냈다 플레이 라운드 (트리0:트리1:나무들) 끝냈다 = 플레이 라운드 나무들 (승자:끝냈다) 어디에 승자 = 게임을 하다 트리0 트리1 - 스테파노프·케르센바움 보고서의 TOURNAMENT-PLAY!를 각색한 작품 게임을 하다 :: 서드 t => 나무 t --^ 입력: ... -> 나무 t --^^ … 두 그루의 나무 -> 나무 t - ^ 결과: '승자'가 있는 '승자' 패자 홍보 -- 두 입력의 *beat* 루트가 있는 트리 게임을 하다 트리1 트리2 rootLabel 트리1 <= rootLabel 트리2 = 진급시키다 트리1 트리2 그렇지 않으면 = 진급시키다 트리2 트리1 - 스테파노프·케르센바움 보고서의 GRAB!에서 각색한 것 진급시키다 :: 나무 t - ^ '승자' -> 나무 t - ^ '로저' -> 나무 t - ^ 결과 : '승자'의 뿌리가 되는 나무 ­ 그리고 누구의 자녀: - * * 'loser' , * * '승자'의 모든 자녀 진급시키다 승자 패자 = 노드. { rootLabel = rootLabel 승자, 하위 포리스트 = 패자 : 하위 포리스트 승자} 본래의 :: IO () 본래의 = 인쇄하다 $ 토너먼트 소트 테스트 목록 어디에 테스트 목록 = [0, 1, 2, 3, 4, 5] 참조
- Kershenbaum 외 1988, "Higher Order Command Programming"