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

Shell, merge, heap sort

Embed Size (px)

Citation preview

Page 1: Shell, merge, heap sort

데이터 구조와 알고리즘쉘 정렬, 병합 정렬, 힙 정렬

Arnold Moon ([email protected])

Page 2: Shell, merge, heap sort

비교 정렬 알고리즘 중에서 유일하게 2차 복잡도보다 적은 복잡도를 가진 정렬이다. 쉘 정렬은 병합, 힙, 퀵 정렬보다 느리다. 하지만, 5000개 이하 항목을 정렬할 때 속도가 매우 중요하지만 않다면 좋은 선택이다.

Gap에 따라서 성능에 차이가 있다.http://en.wikipedia.org/wiki/Shellsort

쉘 정렬

Page 3: Shell, merge, heap sort

입력을 크기 N의 배열로 가정 했을 때, 입력을 어떤 숫자(Gaps)들로 지속적으로 나눈다. 나누어진 작은 입력들을 부분적으로 삽입 정렬 한다.

= 큰 리스트를 작은 리스트로 나눈다. 그리고 작은 리스트들에 대해 삽입 정렬을 수행 한다.

쉘 정렬

Page 4: Shell, merge, heap sort

쉘 정렬예제

입력 = [ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ]N= 10Gap = 2^k-1 (k >= 1) = 1,3,7,15,31,63...

Page 5: Shell, merge, heap sort

쉘 정렬 [ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ]

62 83 18 53 07 17 95 86 47 69

index 1 2 3 4 5 6 7 8 9 10

gap=7 62 47 18 53 07 17 95 86 83 69

gap=3 53 07 17 62 47 18 69 86 83 95

gap=1 07 17 18 47 53 62 69 83 86 95

Page 6: Shell, merge, heap sort

쉘 정렬 중요한 프로그램에서 가끔 사용한다. 콜스택을 사용하지 않기 때문이다. 임베디드 시스템을 대상으로 하는 C 표준 라이브러리의 qsort에서 quick sort대신 사용 한다.(예를 들어 uClibc 라이브러리). 비슷한 이유로 리눅스 커널에도 아직 있다.

Page 7: Shell, merge, heap sort

병합 정렬 퀵 소트의 문제점을 보완하기 위해서 나왔다. 퀵 소트의 가장 큰 문제는 최악의 경우에 복잡도가 O(n^2)이라는 것이다.

스택이 필요 없는 안정적인 알고리즘이다. devide and conquer를 사용 한다.

Page 8: Shell, merge, heap sort

병합 정렬 안정적이다?

Page 9: Shell, merge, heap sort

모든 원소를 작은 부분으로 쪼갠 다음에 다시 하나로 합친다.

병합 정렬

Page 10: Shell, merge, heap sort

병합 정렬 [ 62, 83, 18, 53, 07, 17 , 95, 86, 47, 69 ]

62 83 18 53 07 17 95 86 47 69

62 83 18 53 07 17 95 86 47 69

62 83 18 53 07 17 95 86 47 69

18 62 83 07 17 53 95 47 69 86

07 17 18 53 62 83 95 47 69 86

07 17 18 47 53 62 69 83 86 95

Page 11: Shell, merge, heap sort

힙 정렬 - 조건트리

Page 12: Shell, merge, heap sort

힙 정렬 - 트리각 노드가 여러 개의 노드를 가리키는 데이터 구조.

Page 13: Shell, merge, heap sort

노드의 값이 자식 노드의 값보다 크거나 같다.트리의 높이 h > 0 일 때 모든 잎 노드들이 h 또는 h-1레벨에 있어야 한다.(완전 이진 트리)

힙 정렬 - 힙

Page 14: Shell, merge, heap sort

힙 정렬입력을 힙으로 만든다.

힙의 최상위 에 있는 값이 최대이다.최대 값과 맨 뒤에 있는 값의 위치를 바꾼다.

최대 값을 제외한 입력을 힙으로 만든다.힙의 최상위 에 있는 값이 최대이다.최대 값과 맨 뒤에 있는 값의 위치를 바꾼다.

최대 값을 제외한 입력을 힙으로 만든다....

Page 15: Shell, merge, heap sort

힙 정렬[ 6, 5, 4, 1, 8, 7, 2, 4 ]

[ 8, 6, 7, 4, 5, 3, 2, 1][ 1, 6, 7, 4, 5, 3, 2, 8]

[ 1, 6, 7, 4, 5, 3, 2]

8

6 7

4 5 3 2

1

Page 16: Shell, merge, heap sort

힙 정렬[ 1, 6, 7, 4, 5, 3, 2 ]

[ 7, 6, 3, 4, 5, 1, 2 ][ 2, 6, 3, 4, 5, 1, 7 ]

[ 2, 6, 3, 4, 5, 1 ]

1

6 7

4 5 3 2

7

6 3

4 5 1 2

Page 17: Shell, merge, heap sort

힙 정렬[ 2, 6, 3, 4, 5, 1 ]

[ 6, 5, 3, 4, 2, 1 ][ 1, 5, 3, 4, 2, 6 ]

[ 1, 5, 3, 4, 2 ]

2

6 3

4 5 1

6

5 3

4 2 1

Page 18: Shell, merge, heap sort

힙 정렬[ 1, 5, 3, 4, 2 ]

[ 5, 4, 3, 1, 2 ][ 2, 4, 3, 1, 5 ]

[ 2, 4, 3, 1 ]

1

5 3

4 2

5

4 3

1 2

Page 19: Shell, merge, heap sort

힙 정렬[ 2, 4, 3, 1 ]

[ 4, 2, 3, 1 ][ 1, 2, 3, 4 ]

[ 1, 2, 3 ]

2

4 3

1

4

2 3

1

Page 20: Shell, merge, heap sort

힙 정렬[ 1, 2, 3 ]

[ 3, 2, 1 ][ 1, 2, 3 ]

[ 1, 2 ]

1

2 3

3

2 1

Page 21: Shell, merge, heap sort

힙 정렬[ 1, 2 ]

[ 2, 1 ][ 1, 2 ]

[ 1 ]

1

2

2

1

Page 22: Shell, merge, heap sort

힙 정렬[ 1 ]

1

Page 23: Shell, merge, heap sort

힙 정렬 힙 정렬은 퀵 정렬과 가장 먼저 비교 가능한 일반적인 비교 정렬 알고리즘이다.

worst-case 에서 O(nlogn)이고, 병합정렬과 다르게 상수 만큼의 공간을 요구 한다. 따라서, 보안을 신경 쓰는 시스템이나, 리얼타임 제약 사항이 있는 임베디드 시스템에서는 종종 힙 정렬을 사용 한다.

Page 24: Shell, merge, heap sort