SlideShare a Scribd company logo
데이터 구조와 알
고리즘
퀵 정렬, 트리 정렬
Arnold Moon (arnold.spring@gmail.com)
퀵 정렬은 최악의 경우에는 O(n^2)의 복잡도를 가지지만,
평균적으로 O(nlogn)의 복잡도를 가진다.
퀵정렬은 메모리 참조가 지역화 되어 있으므로 CPU 캐시
히트율이 높아서 대부분의 아키텍쳐에서 효율적으로 동작한
다. 그래서 일반적으로 다른 O(nlogn)보다 훨씬 빠르게 동작
한다.
퀵 정렬
1. 입력에서 하나의 원소를 골라서 Pivot으로 지정한다.
2. Pivot 앞에는 Pivot보다 값이 작은 모든 원소들이 오고,
Pivot 뒤에는 큰 값이 오도록 해서 입력을 둘로 나눈다.
3. 나뉜 두 개의 입력에 대해 재귀적으로 이 과정을 반복한
다.
퀵 정렬
퀵 정렬 - 예제
[ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ]
Pivot을 하나 지정한다. (보통 입력의 가장 왼쪽으로 지정한
다)
Pivot = 62
Pivot을 기준으로 입력을 둘로 나눈다.
퀵 정렬 - 예제
[ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ]
l h
i j
low = 0, high = 9, left = 0, right = 9, pivot = 62 로 지정한다.
i 값이 pivot 보다 클 때 까지 오른쪽으로 움직인다.
그리고 j 값이 pivot 보다 작거나 같을때 까지 왼쪽으로 움직
인다.
퀵 정렬 - 예제
[ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ]
l h
i j
여기서 i와 j의 위치를 교체 한다.
left = 1, right = 8이다.
퀵 정렬 - 예제
[ 62, 47, 18, 53, 07, 17 , 95, 86, 83, 69 ]
l h
i j
i 값이 pivot 보다 클 때 까지 오른쪽으로 움직인다.
그리고 j 값이 pivot 보다 작거나 같을 까지 왼쪽으로 움직인
다.
퀵 정렬 - 예제
[ 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 ]
퀵 정렬 - 예제
[ 17, 47, 18, 53, 07, 62 , 95, 86, 83, 69 ]
이제 2개의 그룹으로 나눠서 새로 정렬한다.
[ 17, 47, 18, 53, 07 ], [ 95, 86, 83, 69 ]
퀵 정렬 - 예제
[ 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를 옮긴다.
퀵 정렬 - 예제
[ 17, 47, 18, 53, 07 ]
l h
i j
여기서 i와 j의 위치를 교체 한다.
left = 1, right = 4이다.
퀵 정렬 - 예제
[ 17, 07, 18, 53, 47 ]
l h
i j
다시 i가 pivot보다 클 때 까지 i를 옮긴다. j가 pivot보다 작거
나 같을 때 까지 j를 옮긴다.
퀵 정렬 - 예제
[ 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 ]
퀵 정렬 - 예제
[ 07, 17, 18, 53, 47 ]
이제 또다시 pivot를 기준으로 나눌 수 있다.
[ 07 ] [ 18, 53, 47 ]
다시 [ 18, 53, 47 ]을 정렬한다.
퀵 정렬 - 예제
[ 18, 53, 47 ]
l h
i j
이제 다시 처음으로 돌아가서 시작한다.
low = 0, high = 2, left = 0, right = 2, pivot = 18
i가 pivot보다 크거나 같을 때 까지 i를 옮긴다. j가 pivot보다
작을나 같을 때 까지 j를 옮긴다.
퀵 정렬 - 예제
[ 18, 53, 47 ]
l h
j i
i가 j 보다 크거나 같으면 더이상 진행 하지 않는다.
이제 low = 0, high = 2, left = 1, right = 0이다.
입력의 low에 right를 입력하고, 입력의 right에 pivot을 입력
한다.
[ 18, 53, 47 ]
퀵 정렬 - 예제
[ 18, 53, 47 ]
이제 또다시 pivot를 기준으로 나눌 수 있다.
[ 53, 47 ]
다시 [ 53, 47 ]을 정렬 한다.
퀵 정렬 - 예제
[ 53, 47 ]
l h
i j
이제 다시 처음으로 돌아가서 시작한다.
low = 0, high = 1, left = 0, right = 1, pivot = 53
i가 pivot보다 크거나 같을 때 까지 i를 옮긴다. j가 pivot보다
작을 때 까지 j를 옮긴다.
퀵 정렬 - 예제
[ 53, 47 ]
l h
i,j
i가 j 보다 크거나 같으면 더이상 진행 하지 않는다.
이제 low = 0, high = 1, left = 1, right = 1이다.
입력의 low에 right를 입력하고, 입력의 right에 pivot을 입력
한다.
퀵 정렬 - 예제
[ 47, 53 ]
이제 또다시 이전 pivot를 기준으로 나눌 수 있다.
[ 47 ]
47은 더이상 정렬 할 필요가 없다.
퀵 정렬 - 예제
처음부터 정렬한 내용을 더해보자.
[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...
퀵 정렬 - 구현 힌트
1. 종료 조건을 찾을 것
2. 분할 정복 방법을 적용 할 것
.
.
.
.
.
http://en.wikipedia.org/wiki/Quicksort pseudocode 참고.
트리 정렬은 최악의 경우에는 O(n^2)의 복잡도를 가지지
만, 평균적으로 O(nlogn)의 복잡도를 가진다.
단순하게 주어진 입력을 통해서 이진 검색 트리를 만들고,
이진 검색 트리를 탐색하여 정렬한다.
이진 검색 트리는 node와 left leaf와 right leaf 사이에 크기
규칙이 있다.
트리 정렬
가운데 Root의 값이 Left Child 보다 반드
시 크고, Right Child 보다 반드시 작다.
BST(이진검색트리)에서 최대값을 찾는
연산의 복잡도는 최악의 경우에 O(n)이
다.
BST에서 원소를 삽입하는 연산의 최대
복잡도는 최악의 경우에 O(n)이다.
트리 정렬
이진 트리의 특성을 생각해보면. 단순히 모든 원소를 빈
BST에 넣고, 최대값을 BST에서 찾으면 된다.
- 평균적인 경우의 복잡도를 보자.
O(모든 원소를 BST에 넣는다 + 최대값을 BST에서 찾는다.)
= O(logn * n + logn * n) = O(2nlogn) = O(logn)
트리 정렬
퀵 정렬은 메모리를 O(logn)만큼 더 차지하지만,
트리 정렬을 메모리를 O(n)만큼 더 차지 한다.
퀵 정렬과 트리 정렬 비교
끝

More Related Content

More from Hyun Jin Moon

Swift 0x19 advanced operators
Swift 0x19 advanced operatorsSwift 0x19 advanced operators
Swift 0x19 advanced operators
Hyun Jin Moon
 
Swift 0x18 access control
Swift 0x18 access controlSwift 0x18 access control
Swift 0x18 access control
Hyun Jin Moon
 
Swift 0x17 generics
Swift 0x17 genericsSwift 0x17 generics
Swift 0x17 generics
Hyun Jin Moon
 
Swift 0x14 nested types
Swift 0x14 nested typesSwift 0x14 nested types
Swift 0x14 nested types
Hyun Jin Moon
 
Swift 0x12 optional chaining
Swift 0x12 optional chainingSwift 0x12 optional chaining
Swift 0x12 optional chaining
Hyun Jin Moon
 
Swift 0x0e 초기화
Swift 0x0e 초기화Swift 0x0e 초기화
Swift 0x0e 초기화
Hyun Jin Moon
 
Swift 0x0d 상속
Swift 0x0d 상속Swift 0x0d 상속
Swift 0x0d 상속
Hyun Jin Moon
 
Swift 0x0c 서브스크립트
Swift 0x0c 서브스크립트Swift 0x0c 서브스크립트
Swift 0x0c 서브스크립트
Hyun Jin Moon
 
Swift 0x02 기본 연산자
Swift 0x02   기본 연산자Swift 0x02   기본 연산자
Swift 0x02 기본 연산자
Hyun Jin Moon
 
Swift 0x01 환경 설정
Swift 0x01   환경 설정Swift 0x01   환경 설정
Swift 0x01 환경 설정
Hyun Jin Moon
 
Shell, merge, heap sort
Shell, merge, heap sortShell, merge, heap sort
Shell, merge, heap sort
Hyun Jin Moon
 
Djang Beginning 2
Djang Beginning 2Djang Beginning 2
Djang Beginning 2
Hyun Jin Moon
 
Programming challange crypt_kicker
Programming challange crypt_kickerProgramming challange crypt_kicker
Programming challange crypt_kicker
Hyun Jin Moon
 
Node.js Cloud Service Publish
Node.js Cloud Service PublishNode.js Cloud Service Publish
Node.js Cloud Service Publish
Hyun Jin Moon
 

More from Hyun Jin Moon (14)

Swift 0x19 advanced operators
Swift 0x19 advanced operatorsSwift 0x19 advanced operators
Swift 0x19 advanced operators
 
Swift 0x18 access control
Swift 0x18 access controlSwift 0x18 access control
Swift 0x18 access control
 
Swift 0x17 generics
Swift 0x17 genericsSwift 0x17 generics
Swift 0x17 generics
 
Swift 0x14 nested types
Swift 0x14 nested typesSwift 0x14 nested types
Swift 0x14 nested types
 
Swift 0x12 optional chaining
Swift 0x12 optional chainingSwift 0x12 optional chaining
Swift 0x12 optional chaining
 
Swift 0x0e 초기화
Swift 0x0e 초기화Swift 0x0e 초기화
Swift 0x0e 초기화
 
Swift 0x0d 상속
Swift 0x0d 상속Swift 0x0d 상속
Swift 0x0d 상속
 
Swift 0x0c 서브스크립트
Swift 0x0c 서브스크립트Swift 0x0c 서브스크립트
Swift 0x0c 서브스크립트
 
Swift 0x02 기본 연산자
Swift 0x02   기본 연산자Swift 0x02   기본 연산자
Swift 0x02 기본 연산자
 
Swift 0x01 환경 설정
Swift 0x01   환경 설정Swift 0x01   환경 설정
Swift 0x01 환경 설정
 
Shell, merge, heap sort
Shell, merge, heap sortShell, merge, heap sort
Shell, merge, heap sort
 
Djang Beginning 2
Djang Beginning 2Djang Beginning 2
Djang Beginning 2
 
Programming challange crypt_kicker
Programming challange crypt_kickerProgramming challange crypt_kicker
Programming challange crypt_kicker
 
Node.js Cloud Service Publish
Node.js Cloud Service PublishNode.js Cloud Service Publish
Node.js Cloud Service Publish
 

Quick, Tree sort

  • 1. 데이터 구조와 알 고리즘 퀵 정렬, 트리 정렬 Arnold Moon (arnold.spring@gmail.com)
  • 2. 퀵 정렬은 최악의 경우에는 O(n^2)의 복잡도를 가지지만, 평균적으로 O(nlogn)의 복잡도를 가진다. 퀵정렬은 메모리 참조가 지역화 되어 있으므로 CPU 캐시 히트율이 높아서 대부분의 아키텍쳐에서 효율적으로 동작한 다. 그래서 일반적으로 다른 O(nlogn)보다 훨씬 빠르게 동작 한다. 퀵 정렬
  • 3. 1. 입력에서 하나의 원소를 골라서 Pivot으로 지정한다. 2. Pivot 앞에는 Pivot보다 값이 작은 모든 원소들이 오고, Pivot 뒤에는 큰 값이 오도록 해서 입력을 둘로 나눈다. 3. 나뉜 두 개의 입력에 대해 재귀적으로 이 과정을 반복한 다. 퀵 정렬
  • 4. 퀵 정렬 - 예제 [ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ] Pivot을 하나 지정한다. (보통 입력의 가장 왼쪽으로 지정한 다) Pivot = 62 Pivot을 기준으로 입력을 둘로 나눈다.
  • 5. 퀵 정렬 - 예제 [ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ] l h i j low = 0, high = 9, left = 0, right = 9, pivot = 62 로 지정한다. i 값이 pivot 보다 클 때 까지 오른쪽으로 움직인다. 그리고 j 값이 pivot 보다 작거나 같을때 까지 왼쪽으로 움직 인다.
  • 6. 퀵 정렬 - 예제 [ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ] l h i j 여기서 i와 j의 위치를 교체 한다. left = 1, right = 8이다.
  • 7. 퀵 정렬 - 예제 [ 62, 47, 18, 53, 07, 17 , 95, 86, 83, 69 ] l h i j i 값이 pivot 보다 클 때 까지 오른쪽으로 움직인다. 그리고 j 값이 pivot 보다 작거나 같을 까지 왼쪽으로 움직인 다.
  • 8. 퀵 정렬 - 예제 [ 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 ]
  • 9. 퀵 정렬 - 예제 [ 17, 47, 18, 53, 07, 62 , 95, 86, 83, 69 ] 이제 2개의 그룹으로 나눠서 새로 정렬한다. [ 17, 47, 18, 53, 07 ], [ 95, 86, 83, 69 ]
  • 10. 퀵 정렬 - 예제 [ 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를 옮긴다.
  • 11. 퀵 정렬 - 예제 [ 17, 47, 18, 53, 07 ] l h i j 여기서 i와 j의 위치를 교체 한다. left = 1, right = 4이다.
  • 12. 퀵 정렬 - 예제 [ 17, 07, 18, 53, 47 ] l h i j 다시 i가 pivot보다 클 때 까지 i를 옮긴다. j가 pivot보다 작거 나 같을 때 까지 j를 옮긴다.
  • 13. 퀵 정렬 - 예제 [ 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 ]
  • 14. 퀵 정렬 - 예제 [ 07, 17, 18, 53, 47 ] 이제 또다시 pivot를 기준으로 나눌 수 있다. [ 07 ] [ 18, 53, 47 ] 다시 [ 18, 53, 47 ]을 정렬한다.
  • 15. 퀵 정렬 - 예제 [ 18, 53, 47 ] l h i j 이제 다시 처음으로 돌아가서 시작한다. low = 0, high = 2, left = 0, right = 2, pivot = 18 i가 pivot보다 크거나 같을 때 까지 i를 옮긴다. j가 pivot보다 작을나 같을 때 까지 j를 옮긴다.
  • 16. 퀵 정렬 - 예제 [ 18, 53, 47 ] l h j i i가 j 보다 크거나 같으면 더이상 진행 하지 않는다. 이제 low = 0, high = 2, left = 1, right = 0이다. 입력의 low에 right를 입력하고, 입력의 right에 pivot을 입력 한다. [ 18, 53, 47 ]
  • 17. 퀵 정렬 - 예제 [ 18, 53, 47 ] 이제 또다시 pivot를 기준으로 나눌 수 있다. [ 53, 47 ] 다시 [ 53, 47 ]을 정렬 한다.
  • 18. 퀵 정렬 - 예제 [ 53, 47 ] l h i j 이제 다시 처음으로 돌아가서 시작한다. low = 0, high = 1, left = 0, right = 1, pivot = 53 i가 pivot보다 크거나 같을 때 까지 i를 옮긴다. j가 pivot보다 작을 때 까지 j를 옮긴다.
  • 19. 퀵 정렬 - 예제 [ 53, 47 ] l h i,j i가 j 보다 크거나 같으면 더이상 진행 하지 않는다. 이제 low = 0, high = 1, left = 1, right = 1이다. 입력의 low에 right를 입력하고, 입력의 right에 pivot을 입력 한다.
  • 20. 퀵 정렬 - 예제 [ 47, 53 ] 이제 또다시 이전 pivot를 기준으로 나눌 수 있다. [ 47 ] 47은 더이상 정렬 할 필요가 없다.
  • 21. 퀵 정렬 - 예제 처음부터 정렬한 내용을 더해보자. [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...
  • 22. 퀵 정렬 - 구현 힌트 1. 종료 조건을 찾을 것 2. 분할 정복 방법을 적용 할 것 . . . . . http://en.wikipedia.org/wiki/Quicksort pseudocode 참고.
  • 23. 트리 정렬은 최악의 경우에는 O(n^2)의 복잡도를 가지지 만, 평균적으로 O(nlogn)의 복잡도를 가진다. 단순하게 주어진 입력을 통해서 이진 검색 트리를 만들고, 이진 검색 트리를 탐색하여 정렬한다. 이진 검색 트리는 node와 left leaf와 right leaf 사이에 크기 규칙이 있다. 트리 정렬
  • 24. 가운데 Root의 값이 Left Child 보다 반드 시 크고, Right Child 보다 반드시 작다. BST(이진검색트리)에서 최대값을 찾는 연산의 복잡도는 최악의 경우에 O(n)이 다. BST에서 원소를 삽입하는 연산의 최대 복잡도는 최악의 경우에 O(n)이다. 트리 정렬
  • 25. 이진 트리의 특성을 생각해보면. 단순히 모든 원소를 빈 BST에 넣고, 최대값을 BST에서 찾으면 된다. - 평균적인 경우의 복잡도를 보자. O(모든 원소를 BST에 넣는다 + 최대값을 BST에서 찾는다.) = O(logn * n + logn * n) = O(2nlogn) = O(logn) 트리 정렬
  • 26. 퀵 정렬은 메모리를 O(logn)만큼 더 차지하지만, 트리 정렬을 메모리를 O(n)만큼 더 차지 한다. 퀵 정렬과 트리 정렬 비교
  • 27.