트리 정렬
Tree sort![]() | |
클래스 | 정렬 알고리즘 |
---|---|
데이터 구조 | 배열 |
최악의 경우 공연 | O(n²) (균형 조정 안 됨) O(n 로그 n) (균형 조정) |
베스트 케이스 공연 | O(n log n)[필요하다] |
평균 공연 | O(n log n) |
최악의 경우 공간 복잡성 | θ(n) |
트리 정렬은 정렬할 요소에서 바이너리 검색 트리를 만든 다음, 요소가 정렬된 순서대로 나오도록 트리(순서 중)를 가로지르는 정렬 알고리즘이다.그것의 일반적인 용도는 온라인에서 요소들을 분류하는 것이다: 각각의 삽입 후에, 지금까지 보여진 요소들의 집합은 정렬된 순서대로 이용 가능하다.
트리 분류는 일회성 분류로 사용할 수 있지만, 둘 다 피벗을 기반으로 원소를 재귀적으로 분할해 퀵소트와 맞먹으며, 퀵소트가 제자리에 있고 오버헤드가 낮기 때문에 퀵소트보다 장점이 적다.자기 균형 트리를 사용할 때 더 나쁜 경우 복잡하지만, 훨씬 더 많은 오버헤드를 가지고 있다.
효율성
이진 검색 트리에 한 항목을 추가하는 것은 평균적으로 O(log n) 프로세스(빅 O 표기법)이다.n개의 항목을 추가하는 것은 O(n log n) 프로세스로 트리가 '빠른 정렬' 프로세스를 만드는 것이다.불균형 이진 트리에 항목을 추가하려면 최악의 경우 O(n) 시간이 필요하다.트리가 연결된 목록(트리 제거)과 유사한 경우이로 인해 이 정렬 알고리즘에 대한 최악의 O(n²) 시간이 발생한다.이러한 최악의 경우는 알고리즘이 이미 정렬된 집합에서 작동하거나, 거의 정렬된 집합, 반전된 집합에서 작동할 때 발생한다.그러나 예상 O(n log n) 시간은 배열을 섞어서 얻을 수 있지만, 이것은 동일한 항목에 도움이 되지 않는다.
최악의 경우 동작은 자가 균형 바이너리 검색 트리를 사용하여 개선할 수 있다.이러한 트리를 사용하면 알고리즘은 O(n log n) 최악의 성능을 가지므로 비교 정렬에 있어 도 최적이다.그러나 트리 정렬 알고리즘은 퀵소트나 힙소트와 같은 인플레이스 알고리즘과는 달리 트리에 별도의 메모리를 할당해야 한다.대부분의 일반적인 플랫폼에서 이는 힙 메모리를 사용해야 한다는 것을 의미하며, 이는 퀵소트 및 힙소트와[citation needed] 비교했을 때 상당한 성능 히트를 친다.splay 트리를 이진 검색 트리로 사용할 경우 결과 알고리즘(splaysort라고 함)은 적응형 정렬이라는 추가 속성을 가지는데, 이는 실행 시간이 거의 정렬된 입력의 경우 O(n log n)보다 빠르다는 것을 의미한다.
예.
다음 트리 정렬 알고리즘(가성코드)은 비교 가능한 항목의 컬렉션을 허용하고 항목을 오름차순으로 출력한다.
구조 바이너리 트리 바이너리 트리:LeftSubTree 오브젝트:노드. 바이너리 트리:RightSubTree 절차 삽입하다(바이너리 트리:서치트리, 오브젝트:항목) IF 서치트리.노드. IS NULL 그럼 세트 서치트리.노드. 토 항목 기타 IF 항목 IS LES TEN 서치트리.노드. 그럼 삽입하다(서치트리.LeftSubTree, 항목) 기타 삽입하다(서치트리.RightSubTree, 항목) 절차 유효한(바이너리 트리:서치트리) IF 서치트리.노드. IS NULL 그럼 종료 절차 기타 유효한(서치트리.LeftSubTree) 방출 서치트리.노드. 유효한(서치트리.RightSubTree) 절차 트리 소트(컬렉션:항목들) 바이너리 트리:서치트리 for 각 개별 항목 인 항목들 삽입하다(서치트리, 개별 항목) 유효한(서치트리)
간단한 기능 프로그래밍 형태에서 알고리즘(하스켈의 경우)은 다음과 같이 보일 것이다.
자료 나무 a = 잎 노드. (나무 a) a (나무 a) 삽입하다 :: 서드 a => a -> 나무 a -> 나무 a 삽입하다 x 잎 = 노드. 잎 x 잎 삽입하다 x (노드. t y s) x <= y = 노드. (삽입하다 x t) y s x > y = 노드. t y (삽입하다 x s) 납작하게 하다 :: 나무 a -> [a] 납작하게 하다 잎 = [] 납작하게 하다 (노드. t x s) = 납작하게 하다 t ++ [x] ++ 납작하게 하다 s 나무를 심다 :: 서드 a => [a] -> [a] 나무를 심다 = 납작하게 하다 . 접다 삽입하다 잎
위의 구현에서 삽입 알고리즘과 검색 알고리즘은 모두 O(n²) 최악의 시나리오가 있다.
외부 링크
![]() | Wikibook 알고리즘 구현에는 다음과 같은 주제의 페이지가 있다: 이진 트리 정렬 |
- 바이너리 트리 Java 애플릿 및 웨이백 머신의 설명(2016년 11월 29일 보관)
- 연결된 목록의 트리 정렬
- 트리 정렬(C++)