quick, tree sort

27
데이터 구조와 고리즘 정렬, 트리 정렬 Arnold Moon ([email protected])

Upload: hyun-jin-moon

Post on 03-Jul-2015

334 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Quick, Tree sort

데이터 구조와 알고리즘퀵 정렬, 트리 정렬

Arnold Moon ([email protected])

Page 2: Quick, Tree sort

퀵 정렬은 최악의 경우에는 O(n^2)의 복잡도를 가지지만, 평균적으로 O(nlogn)의 복잡도를 가진다.

퀵정렬은 메모리 참조가 지역화 되어 있으므로 CPU 캐시 히트율이 높아서 대부분의 아키텍쳐에서 효율적으로 동작한다. 그래서 일반적으로 다른 O(nlogn)보다 훨씬 빠르게 동작한다.

퀵 정렬

Page 3: Quick, Tree sort

1. 입력에서 하나의 원소를 골라서 Pivot으로 지정한다.

2. Pivot 앞에는 Pivot보다 값이 작은 모든 원소들이 오고, Pivot 뒤에는 큰 값이 오도록 해서 입력을 둘로 나눈다.

3. 나뉜 두 개의 입력에 대해 재귀적으로 이 과정을 반복한다.

퀵 정렬

Page 4: Quick, Tree sort

퀵 정렬 - 예제[ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ]

Pivot을 하나 지정한다. (보통 입력의 가장 왼쪽으로 지정한다) Pivot = 62

Pivot을 기준으로 입력을 둘로 나눈다.

Page 5: Quick, Tree sort

퀵 정렬 - 예제[ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ] l h i jlow = 0, high = 9, left = 0, right = 9, pivot = 62 로 지정한다.i 값이 pivot 보다 클 때 까지 오른쪽으로 움직인다. 그리고 j 값이 pivot 보다 작거나 같을때 까지 왼쪽으로 움직인다.

Page 6: Quick, Tree sort

퀵 정렬 - 예제[ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ] l h i j여기서 i와 j의 위치를 교체 한다.left = 1, right = 8이다.

Page 7: Quick, Tree sort

퀵 정렬 - 예제[ 62, 47, 18, 53, 07, 17 , 95, 86, 83, 69 ] l h i ji 값이 pivot 보다 클 때 까지 오른쪽으로 움직인다. 그리고 j 값이 pivot 보다 작거나 같을 까지 왼쪽으로 움직인다.

Page 8: Quick, Tree sort

퀵 정렬 - 예제[ 62, 47, 18, 53, 07, 17 , 95, 86, 83, 69 ] l h j i i가 j 보다 크거나 같으면 더이상 진행 하지 않는다. 이제 low = 0, high = 9, left = 6, right = 5이다.입력의 low에 right를 입력하고, right에 pivot을 입력한다.[ 17, 47, 18, 53, 07, 62 , 95, 86, 83, 69 ]

Page 9: Quick, Tree sort

퀵 정렬 - 예제[ 17, 47, 18, 53, 07, 62 , 95, 86, 83, 69 ]

이제 2개의 그룹으로 나눠서 새로 정렬한다.[ 17, 47, 18, 53, 07 ], [ 95, 86, 83, 69 ]

Page 10: Quick, Tree sort

퀵 정렬 - 예제[ 17, 47, 18, 53, 07 ] l h i j 이제 다시 처음으로 돌아가서 시작한다.low = 0, high = 4, left = 0, right = 4, pivot = 17 i가 pivot보다 크거나 같을 때 까지 i를 옮긴다. j가 pivot보다 작을 때 까지 j를 옮긴다.

Page 11: Quick, Tree sort

퀵 정렬 - 예제[ 17, 47, 18, 53, 07 ] l h i j 여기서 i와 j의 위치를 교체 한다.left = 1, right = 4이다.

Page 12: Quick, Tree sort

퀵 정렬 - 예제[ 17, 07, 18, 53, 47 ] l h i j 다시 i가 pivot보다 클 때 까지 i를 옮긴다. j가 pivot보다 작거나 같을 때 까지 j를 옮긴다.

Page 13: Quick, Tree sort

퀵 정렬 - 예제[ 17, 07, 18, 53, 47 ] l h j i i가 j 보다 크거나 같으면 더이상 진행 하지 않는다. 이제 low = 0, high = 4, left = 2, right = 1이다.입력의 low에 right를 입력하고, 입력의 right에 pivot을 입력한다.[ 07, 17, 18, 53, 47 ]

Page 14: Quick, Tree sort

퀵 정렬 - 예제[ 07, 17, 18, 53, 47 ]

이제 또다시 pivot를 기준으로 나눌 수 있다.[ 07 ] [ 18, 53, 47 ]

다시 [ 18, 53, 47 ]을 정렬한다.

Page 15: Quick, Tree sort

퀵 정렬 - 예제[ 18, 53, 47 ] l h i j이제 다시 처음으로 돌아가서 시작한다. low = 0, high = 2, left = 0, right = 2, pivot = 18 i가 pivot보다 크거나 같을 때 까지 i를 옮긴다. j가 pivot보다 작을나 같을 때 까지 j를 옮긴다.

Page 16: Quick, Tree sort

퀵 정렬 - 예제[ 18, 53, 47 ] l h j i i가 j 보다 크거나 같으면 더이상 진행 하지 않는다. 이제 low = 0, high = 2, left = 1, right = 0이다.입력의 low에 right를 입력하고, 입력의 right에 pivot을 입력한다.[ 18, 53, 47 ]

Page 17: Quick, Tree sort

퀵 정렬 - 예제[ 18, 53, 47 ]

이제 또다시 pivot를 기준으로 나눌 수 있다.[ 53, 47 ]

다시 [ 53, 47 ]을 정렬 한다.

Page 18: Quick, Tree sort

퀵 정렬 - 예제[ 53, 47 ] l h i j이제 다시 처음으로 돌아가서 시작한다. low = 0, high = 1, left = 0, right = 1, pivot = 53 i가 pivot보다 크거나 같을 때 까지 i를 옮긴다. j가 pivot보다 작을 때 까지 j를 옮긴다.

Page 19: Quick, Tree sort

퀵 정렬 - 예제[ 53, 47 ] l h i,j i가 j 보다 크거나 같으면 더이상 진행 하지 않는다. 이제 low = 0, high = 1, left = 1, right = 1이다.입력의 low에 right를 입력하고, 입력의 right에 pivot을 입력한다.

Page 20: Quick, Tree sort

퀵 정렬 - 예제[ 47, 53 ] 이제 또다시 이전 pivot를 기준으로 나눌 수 있다.[ 47 ]

47은 더이상 정렬 할 필요가 없다.

Page 21: Quick, Tree sort

퀵 정렬 - 예제처음부터 정렬한 내용을 더해보자.[17, 47, 18, 53, 07, 62 , 95, 86, 83, 69][17, 47, 18, 53, 07], 62, [95, 86, 83, 69][07], 17, [18, 53, 47], 62 ...[07], 17, 18, [53, 47], 62...[07], 17, 18, 47, [53], 62…07, 17, 18, 47, 53, 62...

Page 22: Quick, Tree sort

퀵 정렬 - 구현 힌트1. 종료 조건을 찾을 것2. 분할 정복 방법을 적용 할 것.....http://en.wikipedia.org/wiki/Quicksort pseudocode 참고.

Page 23: Quick, Tree sort

트리 정렬은 최악의 경우에는 O(n^2)의 복잡도를 가지지만, 평균적으로 O(nlogn)의 복잡도를 가진다.

단순하게 주어진 입력을 통해서 이진 검색 트리를 만들고, 이진 검색 트리를 탐색하여 정렬한다. 이진 검색 트리는 node와 left leaf와 right leaf 사이에 크기 규칙이 있다.

트리 정렬

Page 24: Quick, Tree sort

가운데 Root의 값이 Left Child 보다 반드시 크고, Right Child 보다 반드시 작다. BST(이진검색트리)에서 최대값을 찾는 연산의 복잡도는 최악의 경우에 O(n)이다. BST에서 원소를 삽입하는 연산의 최대 복잡도는 최악의 경우에 O(n)이다.

트리 정렬

Page 25: Quick, Tree sort

이진 트리의 특성을 생각해보면. 단순히 모든 원소를 빈 BST에 넣고, 최대값을 BST에서 찾으면 된다.

- 평균적인 경우의 복잡도를 보자.O(모든 원소를 BST에 넣는다 + 최대값을 BST에서 찾는다.)= O(logn * n + logn * n) = O(2nlogn) = O(logn)

트리 정렬

Page 26: Quick, Tree sort

퀵 정렬은 메모리를 O(logn)만큼 더 차지하지만, 트리 정렬을 메모리를 O(n)만큼 더 차지 한다.

퀵 정렬과 트리 정렬 비교

Page 27: Quick, Tree sort