CHAPTER 6

109
CHAPTER 6 정정 (Sort) 정정정정

description

CHAPTER 6. 정렬 (Sort) 내부정렬. 6.1 정렬의 개요. 정렬 (Sort) : 각 레코드의 특정 부분을 키로 설정하여 키값에 따라 크기순으로 파일의 레코드를 재배열하는 것을 의미 오름차순 ( ascending ):2 개 이상의 자료를 작은 것부터 큰 순서로 정렬 내림차순 ( descending ): 큰 것부터 작은 것 순서로 재배열 키 : 자료를 정렬하는 데 사용하는 기준 값. 6.1 정렬의 개요. 정렬 장소에 따른 분류 내부 정렬 (internal sort) - PowerPoint PPT Presentation

Transcript of CHAPTER 6

Page 1: CHAPTER  6

CHAPTER 6

정렬 (Sort)

내부정렬

Page 2: CHAPTER  6

정렬 (Sort) : 각 레코드의 특정 부분을 키로 설정하여 키값에 따라 크기순으로 파일의 레코드를 재배열하는 것을 의미

오름차순 ( ascending ):2 개 이상의 자료를 작은 것부터 큰 순서로 정렬 내림차순 ( descending ): 큰 것부터 작은 것 순서로 재배열

키 : 자료를 정렬하는 데 사용하는 기준 값

6.1 정렬의 개요

Page 3: CHAPTER  6

정렬 장소에 따른 분류

내부 정렬 (internal sort)– 정렬할 자료를 메인 메모리에 올려서 정렬하는 방식– 정렬 속도가 빠르지만 정렬할 수 있는 자료의 양이 메인

메모리의 용량에 따라 제한됨

외부 정렬 (external sort)– 정렬할 자료를 보조 기억장치에서 정렬하는 방식– 내부 정렬보다 속도는 떨어지지만 내부 정렬로 처리할 수 없는

대용량 자료에 대한 정렬 가능

6.1 정렬의 개요

Page 4: CHAPTER  6

정렬방식에 따른 구분

내부 정렬 방식– 교환 방식 : 키를 비교하고 교환하여 정렬하는 방식

• 선택 정렬 , 버블 정렬 , 퀵 정렬

– 삽입 방식 : 키를 비교하고 삽입하여 정렬하는 방식• 삽입 정렬 , 셸 정렬

– 병합 방식 : 키를 비교하고 병합하여 정렬하는 방식• 2-way 병합 , n-way 병합

– 분배 방식 : 키를 구성하는 값을 여러 개의 부분집합에 분배하여 정렬하는 방식

• 기수 정렬– 선택 방식 : 이진 트리를 사용하여 정렬하는 방식

• 힙 정렬 , 트리 정렬

6.1 정렬의 개요

Page 5: CHAPTER  6

5

6.1 정렬의 개요

외부정렬 방식 보조기억장치를 이용하여 정렬– 디스크 이용 :

• 2-way merge sort, k-way merge sort– 테이프 이용 :

• balanced merge sort• cascade merge sort• polyphase merge sort• oscillating merge sort

Page 6: CHAPTER  6

6

정렬 알고리즘의 선택

정렬하는 연산은 모든 것이 알고리즘으로 구성되어있어 문제해결에 적절하고 업무의 효율성을 높이는

가장 좋은 알고리즘을 선택하기 위해 고려할사항 .• 사용할 컴퓨터 시스템의 특성• 정렬할 자료의 양 ( 데이터 파일의 크기 ) : 

(Internal sort - External sort) • 초기 자료의 배열상태 • 키 (Key) 값의 분포 상태 • 정렬에 소요되는 공간의 크기 ( 스택 공간 ) 및 작업시간• 프로그램 작성시간 • 정렬에 필요한 프로그램

사용할 컴퓨터 시스템의 특성정렬할 자료의 양 ( 데이터 파일의 크기 ) : (Internal sort - External sort)초기 자료의 배열상태

6.1.2 정렬 알고리즘의 선택

Page 7: CHAPTER  6

선택 정렬 (selection sort) 전체 원소들 중에서 기준 위치에 맞는 원소를 선택하여 자리를 교환하는

방식으로 정렬 n 개의 레코드로부터 최소값을 찾아 첫번째 레코드로 이동

수행 방법

① 전체 원소 중에서 가장 작은 원소를 찾아서 선택하여 첫 번째 원소와 자리를 교환 .

② 두 번째로 작은 원소를 찾아 선택 , 두 번째 원소와 자리를 교환 .

③ 세 번째로 작은 원소를 찾아서 세 번째 원소와 자리를 교환 . ④ 이 과정을 반복하면서 정렬을 완성 .

6.2 선택 정렬 (selection sort)

Page 8: CHAPTER  6

선택 정렬 수행 과정 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22} 의 자료들을 선택

정렬 방법으로 정렬하는 과정을 살펴보자 .

① 첫 번째 자리를 기준 위치로 정하고 , 전체 원소 중에서 가장 작은 원소 2 를 선택하여 기준 위치에 있는 원소 69 와 자리 교환

6.2 선택 정렬 (selection sort)

Page 9: CHAPTER  6

② 두 번째 자리를 기준 위치로 정하고 , 나머지 원소 중에서 가장 작은 원소 8 을 선택하여 기준 위치에 있는 원소 10 과 자리 교환

6.2 선택 정렬 (selection sort)

Page 10: CHAPTER  6

③ 세 번째 자리를 기준 위치로 정하고 , 나머지 원소 중에서 가장 작은 원소 10 을 선택하여 기준 위치에 있는 원소 30 과 자리 교환

6.2 선택 정렬 (selection sort)

Page 11: CHAPTER  6

④ 네 번째 자리를 기준 위치로 정하고 , 나머지 원소 중에서 가장 작은 원소 16 을 선택하여 기준 위치에 있는 원소 69 와 자리 교환

6.2 선택 정렬 (selection sort)

Page 12: CHAPTER  6

⑤ 다섯 번째 자리를 기준 위치로 정하고 , 나머지 원소 중에서 가장 작은 원소 22 를 선택하여 기준 위치에 있는 원소 69 와 자리 교환

6.2 선택 정렬 (selection sort)

Page 13: CHAPTER  6

⑥ 여섯 번째 자리를 기준 위치로 정하고 , 나머지 원소 중에서 가장 작은 원소 30 을 선택하여 기준 위치에 있는 원소 30 과 자리 교환 ( 제자리 )

6.2 선택 정렬 (selection sort)

Page 14: CHAPTER  6

⑦ 일곱 번째 자리를 기준 위치로 정하고 , 나머지 원소 중에서 가장 작은 원소 31 을 선택하여 기준 위치에 있는 원소 31 과 자리 교환 . ( 제자리 )

⑧ 마지막에 남은 원소 69 는 전체 원소 중에서 가장 큰 원소로서 이미 마지막 자리에 정렬된 상태이므로 실행을 종료하고 선택 정렬이 완성된다 .

6.2 선택 정렬 (selection sort)

Page 15: CHAPTER  6

선택 정렬 알고리즘 분석 메모리 사용공간

n 개의 원소에 대하여 n 개의 메모리 사용 비교횟수

1 단계 : 첫 번째 원소를 기준으로 n 개의 원소 비교2 단계 : 두 번째 원소를 기준으로 마지막 원소까지 n-1 개의 원소 비교3 단계 : 세 번째 원소를 기준으로 마지막 원소까지 n-2 개의 원소 비교

i 단계 : i 번째 원소를 기준으로 n-i 개의 원소 비교

어떤 경우에서나 비교횟수가 같으므로 시간 복잡도는 O(nO(n22))

6.2 선택 정렬 (selection sort)

Page 16: CHAPTER  6

16

예제5 5 부부

정렬되지 않은 입력 화일이 (17,12,37,54,34,48,21,29) 로 8 개의 항목이 있다 . 이것을 선택 정렬 (insertion sort) 로 분류하면 다음과 같다 .

1 회전 : 17 12 37 54 34 48 21 29

2 회전 : 12 17 37 54 34 48 21 29

3 회전 : 12 17 37 54 34 48 21 29

4 회전 : 12 17 21 54 34 48 37 29

5 회전 : 12 17 21 29 34 48 37 54

6 회전 : 12 17 21 29 34 48 37 54

7 회전 : 12 17 21 29 34 37 48 54

결과 : 12 17 21 29 34 37 48 54

Page 17: CHAPTER  6

17

첫 번째 원소부터 인접한 원소끼리 계속 자리를 교환하면서 맨 마지막 자리로 이동하는 모습이 물 속에서 물 위로 올라오는

물방울 모양과 같다고 하여 버블 (bubble) 정렬이라 함 .

6.3 버블정렬 (bubble sort)

Page 18: CHAPTER  6

버블 정렬 (bubble sort) 인접한 두 개의 원소를 비교하여 자리를 교환하는 방식

첫 번째 원소부터 마지막 원소까지 반복하여 한 단계가 끝나면 가장 큰 원소가 마지막 자리로 정렬

버블 정렬 수행 과정 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22} 의 자료들을 버블

정렬 방법으로 정렬하는 과정을 살펴보자 .① 인접한 두 원소를 비교하여 자리를 교환하는 작업을 첫 번째

원소부터 마지막 원소까지 차례로 반복하여 가장 큰 원소 69 를 마지막 자리로 정렬

6.3 버블정렬 (bubble sort)

Page 19: CHAPTER  6

6.3 버블정렬 (bubble sort)

Page 20: CHAPTER  6

② 버블 정렬을 수행하여 나머지원소 중에서 가장 큰 원소 31 을 끝에서 두 번째 자리로 정렬 .

6.3 버블정렬 (bubble sort)

Page 21: CHAPTER  6

③ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 30 을 끝에서 세 번째 자리로 정렬 .

6.3 버블정렬 (bubble sort)

Page 22: CHAPTER  6

④ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 22 를 끝에서 네 번째 자리로 정렬 .

6.3 버블정렬 (bubble sort)

Page 23: CHAPTER  6

⑤ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 16 을 끝에서 다섯 번째 자리로 정렬 .

6.3 버블정렬 (bubble sort)

Page 24: CHAPTER  6

⑥ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 10 을 끝에서 여섯 번째 자리로 정렬 .

6.3 버블정렬 (bubble sort)

Page 25: CHAPTER  6

⑦ 버블 정렬을 수행하여 나머지 원소 중에서 가장 큰 원소 8 을 끝에서 일곱 번째 자리로 정렬 .

마지막에 남은 첫 번째 원소는 전체 원소 중에서 가장 작은 원소로 이미 정렬된 상태이므로 실행을 종료하고 버블 정렬이 완성된다 .

6.3 버블정렬 (bubble sort)

Page 26: CHAPTER  6

실행 결과

6.3 버블정렬 (bubble sort)

Page 27: CHAPTER  6

버블 정렬 알고리즘 분석 메모리 사용공간

n 개의 원소에 대하여 n 개의 메모리 사용

연산 시간최선의 경우 : 자료가 이미 정렬되어있는 경우

– 비교횟수 : i 번째 원소를 (n-i) 번 비교하므로 , n(n-1)/2 번– 자리교환횟수 : 자리교환이 발생하지 않는다 .

최악의 경우 : 자료가 역순으로 정렬되어있는 경우– 비교횟수 : i 번째 원소를 (n-i) 번 비교하므로 , n(n-1)/2 번– 자리교환횟수 : i 번째 원소를 (n-i) 번 교환하므로 , n(n-1)/2

평균 시간 복잡도 : O(nO(n22))

6.3 버블정렬 (bubble sort)

Page 28: CHAPTER  6

28

예제5 5 부부

정렬되지 않은 입력 화일이 (17,12,37,54,34,48,21,29) 로 8 개의 항목이 있다 . 이것을 버블 정렬로 분류하면 다음과 같다 .

1 회전 : 17 12 37 54 34 48 21 2912 17 37 54 34 48 21 2912 17 37 34 54 48 21 2912 17 37 34 48 54 21 2912 17 37 34 48 21 54 2912 17 37 34 48 21 29 54

1 회전이 완료되면 제일 큰 값인 54 가 맨 뒤에 위치한다 . 그러므로 54 를 제외한 나머지 레코드를 1 회전에서와 마찬가지로 인접한 레코드를 비교 교환하면서 제자리를 찾아간다 .

2 회전 : 12 17 37 34 48 21 29 5412 17 34 37 21 29 48 54

3 회전 : 12 17 34 37 21 29 48 5412 17 34 21 29 37 48 54

4 회전 : 12 17 34 21 29 37 48 5412 17 21 29 34 37 48 54

정렬은 완료되었지만 5 회전 , 6 회전 , 7 회전까지 진행을 한다 .

Page 29: CHAPTER  6

29

버블정렬 , 선택정렬 단계

단계별로 가장 큰 것이 가장 오른쪽으로 이동한다는 점에서 동일 선택정렬은 가장 큰 것과 가장 오른쪽 것이 한번에 스와핑 . 버블 정렬은 가장 큰 것이 한 칸씩 오른 쪽으로 이동

스와핑 ( 교환 , 복사 ) 에 걸리는 시간큰 레코드에 대해서 버블 정렬은 선택 정렬보다 불리

이미 정렬된 데이터

버블 정렬이 최선의 효율 1 단계에서 끝남 . ( 스와핑이 전혀 없음 ). O(N) 의 효율 선택 정렬은 여전히 O(N2) 의 효율 . 가장 큰 데이터인 마지막 데이터가 자기 자신과 스왑 (Self Swap)

Page 30: CHAPTER  6

삽입 정렬 (insert sort) 정렬되어있는 부분집합에 정렬할 새로운 원소의 위치를 찾아

삽입하는 방법 정렬할 자료를 두 개의 부분집합 SS 와 UU 로 가정

부분집합 SS : 정렬된 앞부분의 원소들부분집합 UU : 아직 정렬되지 않은 나머지 원소들정렬되지 않은 부분집합 UU 의 원소를 하나씩 꺼내서 이미

정렬되어있는 부분집합 SS 의 마지막 원소부터 비교하면서 위치를 찾아 삽입

삽입 정렬을 반복 • 부분집합 SS 의 원소는 하나씩 늘림• 부분집합 UU 의 원소는 하나씩 감소 . • 부분집합 UU 가 공집합이 되면 삽입 정렬이 완성 .

6.4 삽입정렬 (insertion sort)

Page 31: CHAPTER  6

삽입 정렬 수행 과정 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22} 의 자료들을 삽입

정렬 방법 . 초기 상태 :

첫 번째 원소는 정렬되어있는 부분 집합 S 로 생각 나머지 원소들은 정렬되지 않은 원소들의 부분 집합 U 로 생각 .

S={69}, U={10, 30, 2, 16, 8, 31, 22}

6.4 삽입정렬 (insertion sort)

Page 32: CHAPTER  6

① U 의 첫 번째 원소 10 을 S 의 마지막 원소 69 와 비교 (10 < 69) 이므로 원소 10 은 원소 69 의 앞자리가 된다 . 더 이상 비교할 S 의 원소가 없으므로 찾은 위치에 원소 10 을 삽입 .

S={10, 69}, U={30, 2, 16, 8, 31, 22}

6.4 삽입정렬 (insertion sort)

Page 33: CHAPTER  6

② U 의 첫 번째 원소 30 을 S 의 마지막 원소 69 와 비교 (30 < 69) 이므로 원소 69 의 앞자리 원소 10 과 비교 . (30 > 10) 이므로 원소 10 과 69 사이에 삽입 . 

S={10, 30, 69}, U={2, 16, 8, 31, 22}

6.4 삽입정렬 (insertion sort)

Page 34: CHAPTER  6

③ U 의 첫 번째 원소 2 를 S 의 마지막 원소 69 와 비교하여

(2 < 69) 이므로 원소 69 의 앞자리 원소 30 과 비교하고 , (2 < 30) 이므로 다시 그 앞자리 원소 10 과 비교하는데 , 

(2 < 10) 이면서 더 이상 비교할 S 의 원소가 없으므로 원소 10 의 앞에 삽입한다 . 

S={2, 10, 30, 69}, U={16, 8, 31, 22}

6.4 삽입정렬 (insertion sort)

Page 35: CHAPTER  6

④ U 의 첫 번째 원소 16 을 S 의 마지막 원소 69 와 비교 (16 < 69) 이므로 그 앞자리 원소 30 과 비교 .

(16 < 30) 이므로 다시 그 앞자리 원소 10 과 비교 ,

(16 > 10) 이므로 원소 10 과 30 사이에 삽입한다 . 

S={2, 10, 16, 30, 69}, U={8, 31, 22}

6.4 삽입정렬 (insertion sort)

Page 36: CHAPTER  6

⑤ U 의 첫 번째 원소 8 을 S 의 마지막 원소 69 와 비교 (8 < 69) 이므로 그 앞자리 원소 30 과 비교 .

(8 < 30) 이므로 그 앞자리 원소 10 과 비교 ,

(8 < 10) 이므로 다시 그 앞자리 원소 2 와 비교 ,

(8 > 2) 이므로 원소 2 와 10 사이에 삽입 .

S={2, 8, 10, 16, 30, 69}, U={31, 22}

6.4 삽입정렬 (insertion sort)

Page 37: CHAPTER  6

⑥ U 의 첫 번째 원소 31 을 S 의 마지막 원소 69 와 비교 (31 < 69) 이므로 그 앞자리 원소 30 과 비교 .

(31 > 30) 이므로 원소 30 과 69 사이에 삽입 . 

S={2, 8, 10, 16, 30, 31, 69}, U={22}

6.4 삽입정렬 (insertion sort)

Page 38: CHAPTER  6

⑦ U 의 첫 번째 원소 22 를 S 의 마지막 원소 69 와 비교 (22 < 69) 이므로 그 앞자리 원소 31 과 비교 .

(22 < 31) 이므로 그 앞자리 원소 30 과 비교 ,

(22 < 30) 이므로 다시 그 앞자리 원소 16 과 비교 ,

(22 > 16) 이므로 원소 16 과 30 사이에 삽입 .

S={2, 8, 10, 16, 22, 30, 31, 69}, U={}{}

U 가 공집합이 되었으므로 실행을 종료하고 삽입 정렬이 완성된다 .

6.4 삽입정렬 (insertion sort)

Page 39: CHAPTER  6

삽입 정렬 알고리즘 분석 메모리 사용공간

n 개의 원소에 대하여 n 개의 메모리 사용 연산 시간

최선의 경우 : 원소들이 이미 정렬되어있어서 비교횟수가 최소인 경우

– 이미 정렬되어있는 경우에는 바로 앞자리 원소와 한번만 비교 .

– 전체 비교횟수 = n-1

– 시간 복잡도 : O(n)O(n)

최악의 경우 : 모든 원소가 역순으로 되어있어서 비교횟수가 최대인 경우

– 전체 비교횟수 = 1+2+3+ ⋯ +(n-1) = n(n-1)/2

– 시간 복잡도 : O(nO(n22))

삽입 정렬의 평균 비교횟수 = n(n-1)/4평균 시간 복잡도 : O(nO(n22))

6.4 삽입정렬 (insertion sort)

Page 40: CHAPTER  6

• 최선의 경우 :이미 정렬된 상태에서의 삽입

• 최악의 경우 :역순으로 정렬된 상태에서의 삽입

6.4 삽입정렬 (insertion sort)

Page 41: CHAPTER  6

실행 결과

6.4 삽입정렬 (insertion sort)

Page 42: CHAPTER  6

42

예제5 5 부부

정렬되지 않은 입력 화일이 (17,12,37,54,34,48,21,29) 로 8 개의 항목이 있다 . 이것을 삽입 정렬로 분류하면 다음과 같다 .

Page 43: CHAPTER  6

43

선택 , 버블 , 삽입

최악의 효율은 모두 O(N2) 으로서 동일

버블 정렬과 삽입 정렬는 안정정렬 레코드들이 하나하나 순차적으로 이동 (Shift) 하기 때문에

원래의 순서가 유지

선택 정렬은 불안정 정렬 스왑 (Swap) 에 의해 단번에 멀리 떨어진 곳으로 이동

  선택 정렬 버블 정렬 삽입 정렬

효율 O(N2) O(N2) O(N2)

안정정렬 No Yes Yes

Page 44: CHAPTER  6

44

6.5 기수정렬 (Radix Sort)

기수 = 키의 구성요소 . 분해된 문자열 , 분해된 문자 .

Page 45: CHAPTER  6

45

6.5 기수 정렬 (radix sort) ( 계속 )

버켓 정렬 (bucket sort)

몇개의 키 K1, K2,...Kn 를 갖는 레코드를 정렬하는 방법 사전식 정렬 (lexical sort)

버켓의 수는 키의 종류 ( 숫자 , 문자 등 ) 에 의해 결정

좌선 정렬 (left first sort) : 최대유효숫자 정렬 (Most Significant Digit Sort : MSD sort)

큰 단위에서작은 단위로 키를 이동

우선 정렬 (right first sort) : 최소유효숫자 정렬 (Least Significant Digit Sort : LSD sort)

작은 단위에서 큰단위로 키를 이동 우선정렬은 각 버켓을 정렬할 필요가 없으므로 더 간단하다 .

Page 46: CHAPTER  6

46

LSD 기수정렬 ( 계속 ) 우선정렬 : 원시리스트 : 7, 19, 24, 13, 31, 8, 82, 18, 44, 63, 5,

10 키는 두자리 (K1, K2) = (10 의 자리 , 1 의 자리 )

K2 = 1 의 자리 숫자에 대한 정렬

0번 버켓부터 FIFO 방식으로 출력 결합 상태 (K2) : R = 10, 31, 82, 13, 63, 24, 44, 5, 7, 8, 18, 19

K1 = 10 의 자리 숫자에 대한 정렬

0번 버켓부터 FIFO 방식으로 출력 결합 상태 (K1) : R = 5, 7, 8, 10, 13, 18, 19, 24, 31, 44, 63, 82

90 1 2 3 4 5 6 7 810 31 82 13

632444

5 7 818

19

90 1 2 3 4 5 6 7 8

050708

10131819

24 31 44

8263

Page 47: CHAPTER  6

47

MSD 기수정렬 ( 계속 ) 좌선정렬 : 원시리스트 : 1H, 9C, 2D, 1S, 3H, 8H 8D, 5S, 4C, 6D

키는 두자리 (K1, K2) = (숫자 , 무늬 )

K1 = 숫자에 대한 정렬

1 번 버켓부터 FIFO 방식으로 출력 결합 상태 (K1) : R = 1H, 1S, 2D, 3H, 4C, 5S, 6D, 8H, 8D, 9C

K2 = 무늬에 대한 정렬 (S: 스페이스 , D: 다이아몬드 , H: 하트 , C:클로바 )

S 버켓부터 FIFO 방식으로 출력 결합 상태 (K2) : R = 1S, 5S, 2D, 6D, 8D, 1H, 3H, 8H, 4C, 9C

S D H C1S5S

1H3H8H

4C9C

2D6D8D

101 2 3 4 5 6 7 8 92D 3H 4C 5S 6D 8H

8D

9C1H1S

Page 48: CHAPTER  6

48

6.5 기수 정렬 (radix sort) ( 계속 )

알고리즘 분석 n : 레코드수 q : 기수의 값 ( 큐의 수 ) k : 디지트 수 ( 키의 수 ) 메모리 사용 공간 : S = ( n + 1) q 연산 시간 : O(k(n+q)) 기억 공간의 낭비는 있지만 자리수 정렬 속도는 빠르다

Page 49: CHAPTER  6

49

6.6 2 원 병합 정렬

⑴ 분할 (divide) : 입력 자료를 같은 크기의 부분집합 2 개로 분할 .

⑵ 정복 (conquer) : 부분집합의 원소들을 정렬 .

순환호출을 이용하여 다시 분할 정복 기법 적용

⑶ 결합 (combine) : 정렬된 부분집합들을 하나의 집합으로 통합

2원 병합 정렬의 진행 순서

Page 50: CHAPTER  6

병합 정렬 (merge sort) 여러 개의 정렬된 자료의 집합을 병합하여 한 개의 정렬된

집합으로 만드는 방법 부분집합으로 분할 (divide),

각 부분집합에 대해서 정렬 작업을 완성 (conquer) 정렬된 부분집합들을 다시 결합 (combine) 분할 정복 (divide and conquer) 기법 사용

병합 정렬 방법의 종류2-way 병합 :

2 개의 정렬된 자료의 집합을 결합 하나의 집합으로 만드는 병합 방법

n-way 병합 : n 개의 정렬된 자료의 집합을 결합하나의 집합으로 만드는 병합 방법

6.6 2 원 병합 정렬

Page 51: CHAPTER  6

병합 정렬 수행 과정 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22} 의 자료들을

병합 정렬 방법으로 정렬하는 과정 . ① 분할 단계 :

정렬할 전체 자료의 집합에 대해서 최소 원소의 부분집합이 될 때까지 분할작업을 반복하여 1 개의 원소를 가진 부분집합 8 개를 만든다 .

6.6 2 원 병합 정렬

Page 52: CHAPTER  6

② 병합단계 : 2 개의 부분집합을 정렬하면서 하나의 집합으로 병합 . 8 개의 부분집합이 1 개로 병합될 때까지 반복 .

6.6 2 원 병합 정렬

Page 53: CHAPTER  6

실행 결과

6.6 2 원 병합 정렬

Page 54: CHAPTER  6

54

합병정렬 들어가고 나오기

6.6 2 원 병합 정렬

Page 55: CHAPTER  6

55

6.6 2 원 병합 정렬

완전히 정렬된 서로 다른 두개의 파일을 혼합하여 완전히 정렬된 하나의 파일로 만드는 것 입력 : (Rl, Rl+1, ..., Rm), (Rm+1, Rm+2, ..., Rn)

출력 : (Xl, Xl+1, ..., Xm, Xm+1, Xm+2, ..., Xn)

n=10, 키값의 순서 = (23, 6, 38, 3, 65, 14, 57, 18, 46, 21)

초기 상태 : 23 6 38 3 65 14 57 18 46 21

1 회전 후 : 6 23 3 38 14 65 18 57 21 46

2 회전 후 : 3 6 23 38 14 18 57 65 21 46

3 회전 후 : 3 6 14 18 23 38 57 65 21 46

4 회전 후 : 3 6 14 18 21 23 38 46 57 65

Page 56: CHAPTER  6

병합 정렬 알고리즘 분석 메모리 사용공간

각 단계에서 새로 병합하여 만든 부분집합을 저장할 공간이 추가로 필요

원소 n 개에 대해서 (2 x n2 x n) 개의 메모리 공간 사용

연산 시간분할 단계 : n 개의 원소를 분할하기 위해서 logog22nn 번의 단계

수행병합 단계 : 부분집합의 원소를 비교하면서 병합하는 단계에서

최대 nn 번의 비교연산 수행전체 병합 정렬의 시간 복잡도 : O(n logO(n log22n)n)

6.6 2 원 병합 정렬

Page 57: CHAPTER  6

57

삽입정렬과 합병정렬

효율 O(N2) 대 O(NlgN) 좋은 알고리즘은 슈퍼 컴퓨터보다 낫다 .

삽입정렬

합병정렬

N=103 N=106 N=109

PC 순간적 2.8 시간 317년

수퍼 컴 순간적 1 초 1.7 주

N=103 N=106 N=109

PC 순간적 1 초 18분

수퍼 컴 순간적 순간적 순간적

Page 58: CHAPTER  6

58

6.7 쉘 정렬

Page 59: CHAPTER  6

일정한 간격 (interval) 으로 떨어져있는 자료들 부분집합구성 각 부분집합 원소들 삽입 정렬을 수행 작업 반복전체 원소들을 정렬하는 방법

전체 원소에 대해서 삽입 정렬을 수행하는 것보다 부분집합으로 나누어 정렬하게 되면 비교연산과 교환연산 감소

셸 정렬의 부분집합 부분집합의 기준이 되는 간격을 매개변수 h 에 저장 한 단계가 수행될 때마다 h 의 값을 감소시키고 셸 정렬을 순환 호출

– h 가 1 이 될 때까지 반복

셸 정렬의 성능은 매개변수 h 의 값에 좌우 . 정렬할 자료의 특성에 따라 매개변수 생성 함수를 사용 일반적으로 사용하는 h 의 값은 원소 개수의 1/2 을 사용

한 단계 수행될 때마다 h 의 값을 반으로 감소서 반복 수행

6.7 쉘 정렬

Page 60: CHAPTER  6

셸 정렬 수행 과정 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22} 의 자료 셸

정렬 과정

① 원소의 개수가 8 개이므로 매개변수 h 는 4 에서 시작한다 . h=4 이므로 간격이 4 인 원소들을 같은 부분 집합으로 만들면 4 개의 부분 집합이 만들어진다 .

69 10 30 2 16 8 31 22

①②

③④

6.7 쉘 정렬

Page 61: CHAPTER  6

첫 번째 부분 집합 {69, 16} 에 대해서 삽입 정렬을 수행 .

두 번째 부분 집합 {10, 8} 에 대해서 삽입 정렬 수행 .

69 10 30 2 16 8 31 22

1616 10 30 2 6969 8 31 22

삽입정렬 수행 전

삽입정렬 수행 후후

16 10 30 2 69 8 31 22

16 88 30 2 69 1010 31 22

삽입정렬 수행 전

삽입정렬 수행 후후

6.7 쉘 정렬

Page 62: CHAPTER  6

세 번째 부분 집합 {30, 31} 에 대해서 삽입 정렬수행 ,(30<31) 이므로 자리 교환은 이루어지지 않는다 .

        

네 번째 부분 집합 {2, 22} 에 대해서 삽입 정렬 수행 ,

(2<22) 이므로 자리 교환은 이루어지지 않는다 .

16 8 30 2 69 10 31 22

16 8 30 2 69 10 31 22

6.7 쉘 정렬

Page 63: CHAPTER  6

② 이제 h 를 2 로 변경하고 다시 셸 정렬 시작 . h=2 이므로 간격이 2 인 원소들을 같은 부분 집합으로 만들면 2 개의 부분 집합 .

첫 번째 부분 집합 {16, 30, 69, 31} 에 대해서 삽입 정렬을 수행하여 정렬

16 8 30 2 69 10 31 22

①②

16 8 30 2 69 10 31 22

16 8 30 2 3131 10 6969 22

삽입정렬 수행 전

삽입정렬 수행 후후

6.7 쉘 정렬

Page 64: CHAPTER  6

두 번째 부분 집합 {8, 2, 10, 22} 에 대해서 삽입 정렬을 수행하여 정렬 .

16 8 30 2 31 10 69 22

16 22 30 88 31 10 69 22

삽입정렬 수행 전

삽입정렬 수행 후후

6.7 쉘 정렬

Page 65: CHAPTER  6

③ 이제 h 를 1 로 변경하고 다시 셸 정렬 시작 . h=1 이므로 간격이 1 인 원소들을 같은 부분 집합으로 만들면 1 개의 부분 집합생성 . 즉 , 전체 원소에 대해서 삽입 정렬을 수행하고 셸정렬완성 .

16 2 30 8 31 10 69 22

22 88 1010 1616 2222 3030 3131 6969

삽입정렬 수행 전

삽입정렬 수행 후후

6.7 쉘 정렬

Page 66: CHAPTER  6

실행 결과

6.7 쉘 정렬

Page 67: CHAPTER  6

셸 정렬 알고리즘 분석 메모리 사용공간

n 개의 원소에 대하여 n 개의 메모리와 매개변수 h 에 대한 저장공간 사용

연산 시간비교횟수

– 처음 원소의 상태에 상관없이 매개변수 h 에 의해 결정

일반적인 시간 복잡도 : O(nO(n1.251.25))셸 정렬은 삽입 정렬의 시간 복잡도 O(n2) 보다 개선된

정렬 방법

6.7 쉘 정렬

Page 68: CHAPTER  6

68

예제5 5 부부

정렬되지 않은 입력 화일이 (17,12,37,54,34,48,21,29) 로 8 개의 항목이 있다 . 이것을 쉘 정렬로 분류하면 다음과 같다 .

① 매개 변수 h1=4 (4 개의 부분 화일로 구성 )

17 12 37 54 21 29 34 48

17, 12, 34, 48, 21, 29, 37, 54

② 매개 변수 h2=h1/2=4/2=2 (2 개의 부분 화일로 구성 )

17 12 34 48 21 29 37 54

17, 12, 21, 29, 34, 48, 37, 54

③ 매개 변수 h3=h2/2=2/2=1 (1 개의 부분 화일로 구성 )

17 12 21 29 34 48 37 54

한 개의 부분 화일을 삽입 정렬로 순서 배열한다 .

[ 결과 ] 12 17 21 29 34 37 48 54

Page 69: CHAPTER  6

69

6.7 쉘 정렬 (shell sort)( 계속 ) n = 12, 입력 파일 R = (7, 19, 24, 13, 31, 8, 82, 18, 44, 63, 5, 29) 매개변수 값 H = (1, 2, 3, 4, 6)

h = h5 = 6 (6 개의 부파일 ), 부파일의 크기 = 2

7 19 24 13 31 8 82 18 44 63 5 29

h = h4 = 4 (4 개의 부파일 ), 부파일의 크기 = 3

7 18 24 13 5 8 82 19 44 63 31 29

h = h3= 3 (3 개의 부파일 ), 부파일의 크기 = 4 5 8 24 13 7 18 31 19 44 63 82 29

h = h2= 2 (2 개의 부파일 ), 부파일의 크기 = 6

5 7 18 13 8 24 31 19 29 63 82 44

h = h1 = 1 (1 개의 부파일 ), 부파일의 크기 = 12 5 7 18 13 8 24 31 19 29 63 82 44

삽입정렬을 수행

Page 70: CHAPTER  6

70

6.9 퀵 정렬• 1962년 C. A. R. Hoare 에 의해 개발된 알고리즘

• 평균적으로 가장 빠른 정렬 수행

• 정렬하고자 하는 리스트 내에서 선택되는 특정 키 값을 중심으로 작은 키 값의 레코드들과 큰 값의 레코드들로 분리 서브 리스트 구성

• 각 서브 리스트에 대하여 퀵 정렬을 순환적으로 적용하는 정렬 방법

• 피벗 (pivot) : 특정 키 값으로 선택되는 레코드의 키

• 일반적으로 피벗은 리스트의 첫 번째 레코드의 키 값 선택

Page 71: CHAPTER  6

퀵 정렬 수행 과정

정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22} 의 자료들을 퀵 정렬 방법으로 정렬하는 과정을 살펴보자 . ① 원소의 개수가 8 개이므로 네 번째 자리에 있는 원소 2 를 첫

번째 피봇으로 선택하고 퀵 정렬 시작 .

6.9 퀵 정렬

Page 72: CHAPTER  6

L이 오른쪽으로 이동하면서 피봇 보다 크거나 같은 원소를 찾고 , R 은 왼쪽으로 이동하면서 피봇 보다 작은 원소를 찾는다 .

L은 원소 69 를 찾았지만 , R 은 피봇 보다 작은 원소를 찾지 못한 채로 원소 69 에서 L 과 만나게 된다 .

LL 과 과 RR 이 만났으므로이 만났으므로 , 원소 69 를 피봇과 교환하여 피봇 원소 2 의 위치를 확정한다 .

6.9 퀵 정렬

Page 73: CHAPTER  6

② 피봇 2 의 왼쪽 부분 집합은 공집합이므로 퀵 정렬을 수행하지 않고 , 오른쪽 부분 집합에 대해서 퀵 정렬 수행 .

오른쪽 부분 집합의 원소가 7 개 이므로 가운데 있는 원소 16을 피봇으로 선택

L 이 찾은 30 과 R 이 찾은 8 을 서로 교환한다 .

6.9 퀵 정렬

Page 74: CHAPTER  6

현재 위치에서 L과 R 의 작업을 반복한다 .L은 원소 69 를 찾았지만 , R 은 피봇 보다 작은 원소를

찾지 못한 채로 원소 69 에서 L과 만나게 된다 . LL 과 과 RR 이 만났으므로이 만났으므로 , 원소 69 를 피봇과 교환하여 피봇 원소 16 의 위치를 확정 .

6.9 퀵 정렬

Page 75: CHAPTER  6

③ 피봇 16 의 왼쪽 부분 집합에서 원소 10 을 피봇으로 선택하여 퀵 정렬 수행 .

L의 원소 10 과 R 의 원소 8 을 교환하는데 , L 의 원소가 피봇이므로 피봇 원소 10 의 위치가 확정 .

6.9 퀵 정렬

Page 76: CHAPTER  6

④ 피봇 10 의 왼쪽 부분 집합의 원소가 한 개이므로 퀵 정렬을 수행하지 않고 , 오른쪽 부분 집합은 공집합이므로 역시 퀵 정렬을 수행하지 않는다 .

이제 1 단계의 피봇이었던 원소 16 의 오른쪽 부분 집합에 대해 퀵 정렬 수행 .

오른쪽 부분 집합의 원소가 4 개이므로 원소 30 을 피봇으로 선택 .

L이 찾은 69 와 R 이 찾은 22 를 서로 교환 .

22 8 1010 1616 69 30 31 22피봇

6.9 퀵 정렬

Page 77: CHAPTER  6

현재 위치에서 L과 R 의 작업을 반복 . L은 오른쪽으로 이동하면서 피봇 보다 크거나 같은 원소인 30 을 찾고 ,

R 은 왼쪽으로 이동하면서 피봇 보다 작은 원소를 찾다가 못 찾고 원소 30 에서 L과 만난다 .

L과 R 이 만났으므로 피봇과 교환하는데 R 의 원소가 피봇이므로 결국 제자리가 확정 .

6.9 퀵 정렬

Page 78: CHAPTER  6

⑤ 피봇 30 의 왼쪽 부분 집합의 원소가 한 개 이므로 퀵 정렬을 수행하지 않고 , 오른쪽 부분 집합에 대해서 퀵 정렬 수행 .

오른쪽 부분 집합의 원소 2 개 중에서 원소 31 을 피봇으로 선택

L은 오른쪽으로 이동하면서 원소 31 을 찾고 , R 은 왼쪽으로 이동하면서 피봇 보다 작은 원소를 찾다가 못 찾은 채로 원소 31 에서 L과 만난다 .

L과 R 이 만났으므로 피봇과 교환하는데 R 의 원소가 피봇이므로 결국 제자리가 확정 .

6.9 퀵 정렬

Page 79: CHAPTER  6

피봇 31 의 오른쪽 부분 집합의 원소가 한 개이므로 퀵 정렬을

수행하지 않는다 .

이로써 전체 퀵 정렬이 모두 완성 .

6.9 퀵 정렬

Page 80: CHAPTER  6

퀵 정렬 알고리즘 분석

메모리 사용공간 n 개의 원소에 대하여 n 개의 메모리 사용

연산 시간 최선의 경우

– 피봇에 의해서 원소들이 왼쪽 부분 집합과 오른쪽 부분 집합으로 정확히 n/2 개씩 이등분이 되는 경우가 반복되어 수행 단계 수가 최소가 되는 경우

최악의 경우 – 피봇에 의해 원소들을 분할하였을 때 1 개와 n-1 개로

한쪽으로 치우쳐 분할되는 경우가 반복되어 수행 단계 수가 최대가 되는 경우

평균 시간 복잡도 : O(O(n n loglog22nn))

– 같은 시간 복잡도를 가지는 다른 정렬 방법에 비해서 자리 교환 횟수를 줄임으로써 더 빨리 실행되어 실행 시간 성능이 좋은 정렬 방법

6.9 퀵 정렬

Page 81: CHAPTER  6

퀵 정렬 수행 과정① 퀵 정렬을 위한 초기 레코드

26 5 37 1 61 11 59 15 48 19 1 10

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first last

* first, last : 정렬 리스트의 시작과 마지막 레코드 위치

* 피벗 : R1 의 키 값 26

② 피벗의 왼쪽에서 오른쪽 방향으로 피벗보다 큰 키 값 (R3) 를 찾고 , 마지막 레코드의 키 값부터 왼쪽으로 작은 키 값 (R10) 을 찾는다

피벗

26 5 37 1 61 11 59 15 48 19 1 10

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

Page 82: CHAPTER  6

③ ②에서 찾은 각각의 키 값의 레코드를 교환 , 같은 방법으로 레코드의 키 값을 찾음

26 5 19 1 61 11 59 15 48 37 1 10

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first last

④ 레코드 R5 와 R8 을 교환 , 오른쪽에서 왼쪽으로 진행 , 피벗보다 작은 레코드 (R6) 의 키 값을 찾음

피벗

26 5 19 1 15 11 59 61 48 37 1 10

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

Page 83: CHAPTER  6

⑤피벗과 교환을 한 후 2 개의 서브 리스트가 구성

11 5 19 1 15 26 59 61 48 37 1 10

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first last

⑥ 첫 번째 서브 리스트에서 퀵 정렬 수행피벗

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

11 5 19 1 15 26 59 61 48 37 1 5

⑦ 레코드 R3 와 R4 를 교환

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

11 5 1 19 15 26 59 61 48 37 1 5

Page 84: CHAPTER  6

⑧ 피벗 (R1) 과 레코드 R3 교환

1 5 11 19 15 26 59 61 48 37 1 5

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

⑨ 그림과 같은 서브 리스트가 구성 , 정렬이 이루어짐

1 5 11 19 15 26 59 61 48 37 1 2

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

⑩ 다음 서브 리스트의 퀵 정렬이 그림과 같이 수행 , 피벗과 레코드 R5 교환

1 5 11 19 15 26 59 61 48 37 4 5

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

Page 85: CHAPTER  6

⑪ 서브 리스트의 레코드 R4, R5 교환 후 정렬

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

⑫ 7 번 레코드 부터 10번 레코드까지의 서브 리스트의 피벗을 R7 의 키 값으로 선택 , 퀵 정렬

피벗

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

1 5 11 15 19 26 59 61 48 37 4 5

last

1 5 11 15 19 26 59 61 48 37 7 10

⑬ 레코드 R8 과 R10 교환 후 피벗과 교환 할 R9 레코드 선택

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first last

피벗

1 5 11 15 19 26 59 37 48 61 7 10

Page 86: CHAPTER  6

⑭ 피벗과 R9 레코드를 교환 , 그림과 같은 서브 리스트 구성

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

1 5 11 15 19 26 48 37 59 61 7 10

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first last

피벗

⑮ R7 과 R8 로 구성된 서브 리스트의 피벗을 R7 의 키 값으로 선택 후 퀵 정렬

1 5 11 15 19 26 48 37 59 61 7 10

Page 87: CHAPTER  6

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first last

(17) 레코드 R10 으로 구성된 서브 리스트의 퀵 정렬 수행 결과

피벗

R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 first

피벗

last

(16) 서브 리스트에 대한 퀵 정렬수행 결과 그림과 같다

1 5 11 15 19 26 37 48 59 61 7 10

1 5 11 15 19 26 37 48 59 61 10 10

Page 88: CHAPTER  6

88

6.9 퀵정렬 (quick sort)( 계속 ) n = 13, 입력화일 R = (29,17,12 ,69 ,30 ,18, 53, 46,

55,33,24 ,89 ,66)

m n R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13

1 13 [29 17 12 <69> 30 18 <53> 46 <55><33 ><24 > 89

66 ]

1 8 [<29>17 12 <24> 30 <18> 46 33 ] 53 [ 55 69 89 66 ]

1 3 [ 18 17 12 <24> 30 29 46 33 ] 53 [ 55 69 89 66 ]

5 8 [ 12 17 18] 24 [30 <29> 46 33 ] 53 [ 55 69 89 66 ]

6 8 12 17 18 24 29 [30 <46> 33 ] 53 [ 55 69 89 66 ]

10 13 12 17 18 24 29 30 33 46 53 [ 55 <69> 89 66 ]

10 13 12 17 18 24 29 30 33 46 53 [ 55 66 69 89 ]

정렬화일 12 17 18 24 29 30 33 46 53 55 66 69 89

Page 89: CHAPTER  6

89

6.9 퀵정렬 (quick sort)( 계속 )

n = 10, 입력화일 R = (26, 5, 37, 1, 61, 11, 59, 15, 48, 19)

m n R1 R2 R3 R4 R5 R6 R7 R8 R9 R10

1 10 [ 26 5 (37) 1 <61> 11 59 <15> 48 (19) ]

1 5 [ 11 5 (19) (1) 15 ] 26 [ 59 61 48 37 ]

1 2 [ 1 5 ] 11 [ 19 15 ] 26 [ 59 61 48 37 ]

4 5 1 5 11 [ 19 15 ] 26 [ 59 61 48 37 ]

7 10 1 5 11 15 19 26 [ 59 (61) 48 (37) ]

7 8 1 5 11 15 19 26 [ 48 37 ] 59 [ 61 ]

10 10 1 5 11 15 19 26 37 48 59 [ 61 ]

정렬화일 1 5 11 15 19 26 37 48 59 61

Page 90: CHAPTER  6

90

설명5 5 부부

29 17 12 69 30 18 53 46 55 33 24 89 66기준 키는 중간에 위치한 7 번째 값인 53 이다 . 왼쪽 끝에서 오른쪽으로 53 보다 큰 값을 찾아간다 .

이와 병행하여 오른쪽 끝에서 왼쪽으로 53 보다 작은 값을 찾는다 . 왼편 해당자를 찾는 작업은 색인 값을 1,2,3…으로 변화시켜 가면서 찾겠고 , 오른편 해당자를 찾는 작업은 색인 값을 13,12,11,... 으로 변화시킬 것이다 .

29 17 12 69 30 18 53 46 55 33 24 89 66이제 오른편 해당자와 왼편 해당자를 찾았는데 이들을 각각 노란색으로 표시 . 지적한 두 수치의 위치를 서로 바꾼 후 같은 작업을 반복 .

33 과 55 를 서로 바꾼 후 33 과 55 사이에 기준 키 53 을 위치시킨다 . 53 을 기준으로 한 일련의 작업이 완수한 것29 17 12 24 30 18 53 46 33 55 69 89 66이제 53 은 제자리를 찾는다 .

[29 17 12 24 30 18 46 33] 53 [55 69 89 66]

Page 91: CHAPTER  6

91

설명5 5 부부

색인 값 10,13 을 스택에 기록 . 색인 값 1 에서 8 까지의 부분 화일 1 을 중간에 있는 24 를 선택하고 시행 .[29 17 12 24 30 18 46 33] 53 [55 69 89 66] 스택 <10,13>[18 17 12] 24 [30 29 46 33] 53 [55 69 89 66] 스택 <10,13,5,8>[18 17 12] 24 [30 29 46 33] 53 [55 69 89 66] 스택 <10,13,5,8> 색인 값 1 에서 3 까지의 부분 화일을 중간에 있는 17 를 선택하고 시행 . 12 17 18 24 [30 29 46 33] 53 [55 69 89 66] 스택 <10,13>

색인 값 5 에서 8 까지의 부분 화일을 중간에 있는 29 를 선택하고 시행 . 12 17 18 24 29 [30 46 33] 53 [55 69 89 66] 스택 <10,13>

색인 값 6 에서 8 까지의 부분 화일을 중간에 있는 46 를 선택하고 시행 . 12 17 18 24 29 30 33 46 53 [55 69 89 66]

색인 값 10 에서 13 까지의 부분 화일을 중간에 있는 69 를 선택하고 시행 .

12 17 18 24 29 30 33 46 53 [55 69 89 66]

12 17 18 24 29 30 33 46 53 55 69 66 89]

이제 69 은 제자리를 찾아간다 .

( 결과 ) 12 17 18 24 29 30 33 46 53 55 66 69 89

Page 92: CHAPTER  6

92

합병 정렬 , 퀵 정렬

효율비교

합병정렬은 매 단계마다 완벽한 균형 합병정렬은 최악의 경우에도 O(NlgN) 을 보장 퀵정렬은 최악의 경우 O(N2) 퀵정렬은 임시저장공간이 불필요한 제자리 연산

(In-Place Computation) 합병정렬은 임시저장공간에 옮겨 가고 옮겨오는 시간이 필요 평균적으로는 퀵정렬이 빠름

Page 93: CHAPTER  6

93

정렬방식 비교

합병정렬

퀵 정렬

삽입 , 퀵 , 합병

  N=103 N=106 N=109

PC 순간적 1 초 18분

수퍼 컴 순간적 순간적 순간적

N=103 N=106 N=109

PC 순간적 0.3초 6 분

수퍼 컴 순간적 순간적 순간적

  삽입 정렬 퀵 정렬 합병 정렬

최악의 효율 N2 N2 NlgN

최선의 효율 N NlgN NlgN

평균적 효율 N2 NlgN NlgN

이미 정렬된 데이터 N N2 NlgN

반대로 정렬된 데이터 N2 N2 NlgN

공간 N N 2N

안정정렬 Yes No YES

Page 94: CHAPTER  6

94

6.8 히프 정렬 (heap sort, tree sort)

heap 각 노드의 키값이 자식노드들의 키값보다 작지 않은 전이진트리 노드 추가 : 가장 큰 레벨의 맨 우측에 삽입 i번 노드의 좌우 자식노드는 각각 2i 번과 2i+1 번 노드이다

정렬 과정 주어진 트리를 heap 로 바꾼다 근노드를 제거하여 출력하고 , 나머지 트리를 조정하여 heap 을 유지

Page 95: CHAPTER  6

힙 정렬 수행 과정 정렬되지 않은 {69, 10, 30, 2, 16, 8, 31, 22} 의 자료들을 힙 정렬

방법으로 정렬하는 과정을 살펴보자 . 초기 상태 : 정렬할 원소가 8 개 이므로 노드가 8 개인 완전 이진

트리를 만들고 , 최대 힙으로 구성한다 .

6.7 히프 정렬

Page 96: CHAPTER  6

① 힙에 삭제 연산을 수행하여 루트 노드의 원소 69 를 구해서 배열의 마지막 자리에 저장 , 나머지 원소들에 대해서 최대 힙으로 재구성

6.7 히프 정렬

Page 97: CHAPTER  6

② 힙에 삭제 연산을 수행하여 루트 노드의 원소 31 을 구해서 배열의 비어있는 마지막 자리에 저장 , 나머지 힙을 최대 힙으로 재구성

6.7 히프 정렬

Page 98: CHAPTER  6

③ 힙에 삭제 연산을 수행하여 루트 노드의 원소 30 을 구해서 배열의 비어있는 마지막 자리에 저장 , 나머지 원소들에 대해서 최대 힙으로 재구성

6.7 히프 정렬

Page 99: CHAPTER  6

④ 힙에 삭제 연산을 수행하여 루트 노드의 원소 22 를 구해서 배열의 비어있는 마지막 자리에 저장 , 나머지 원소들에 대해서 최대 힙으로 재구성

6.7 히프 정렬

Page 100: CHAPTER  6

⑤ 힙에 삭제 연산을 수행하여 루트 노드의 원소 16 을 구해서 배열의 비어있는 마지막 자리에 저장 , 나머지 원소들에 대해서 최대 힙으로 재구성

6.7 히프 정렬

Page 101: CHAPTER  6

⑥ 힙에 삭제 연산을 수행하여 루트 노드의 원소 10 을 구해서 배열의 비어있는 마지막 자리에 저장 , 나머지 원소들에 대해서 최대 힙으로 재구성

6.7 히프 정렬

Page 102: CHAPTER  6

⑦ 힙에 삭제 연산을 수행하여 루트 노드의 원소 8 을 구해서 배열의 비어있는 마지막 자리에 저장 , 나머지 원소들에 대해서 최대 힙으로 재구성

6.7 히프 정렬

Page 103: CHAPTER  6

⑧ 힙에 삭제 연산을 수행하여 루트 노드의 원소 2 를 구해서 배열의 비어있는 마지막 자리에 저장 , 나머지 힙을 최대 힙으로 재구성하는데 공백 힙이 되었으므로 힙 정렬 종료

6.7 히프 정렬

Page 104: CHAPTER  6

힙 트리 생성 키 값 : 28, 7, 79, 3, 64, 15, 58 ① 노드 7 과 노드 64 교환 , 서브 트리의 루트가 자식 노드의 키 값보다 큰 값을 갖도록 한다 . ②루트 노드 28 과 오른쪽 자식 노드의 키 값 교환 , 루트 노드의 키 값이 큰 값이 되도록 한다

28

7 79

3 64 15 58

교환

28

64 79

3 7 15 58

교환

79

64 28

3 7 15 58

교환

79

64 58

3 7 15 28

③ 오른 쪽 서브 트리의 루트 노드 28 과 오른 쪽 자식 노드 58 교환 , 자식 노드의 키 값이 루트 노드의 키 값보다 크지 않도록 한다 . ④ 균형이 있는 완전 이진 트리의 힙 트리 구성

Page 105: CHAPTER  6

이한출판사

힙 트리를 이용한 정렬 과정

28

64 58

3 7 15 79

58

64 28

3 7 15 79

교환79

64 58

3 7 15 28

(a) 79 출력 (b) 힙 트리의 재구성

교환교환

64

58 28

3 7 15 79

교환

15

58 28

3 7 64 79

교환58

15 28

3 7 64 79

교환

(c) 64 출력 (d) 힙의 재구성 후 58 츌력

Page 106: CHAPTER  6

7

15 28

3 58 64 79

28

15 7

3 58 64 79(e) 힙의 재구성

교환

7

3 15

28 58 64 79

교환 3

7 15

28 58 64 79

교환

28

15 7

3 58 64 79

교환

(f) 28 출력

3

15 7

28 58 64 79

15

3 7

28 58 64 79(g) 힙의 재구성

15

3 7

28 58 64

(h) 15 출력

교환

79

(i) 7 출력 (j) 3 출력

3

7 15

28 58 64 79

(k) 힙정렬 (3,7,15,28,58,64,79)

Page 107: CHAPTER  6

107

6.8 히프 정렬 (heap sort)( 계속 )

입력화일 R = (26, 5, 37, 1, 61, 11, 59, 15, 48, 19) 이진트리 R 을 heap 으로 변환

59

26

5 37

48 61 11

15 1 19

37

26

5 59

48 61 11

15 1 19

59

26

61 37

48 19 11

15 1 5

26

5 37

1 61 11

15 48 19

59

37

61

48 59

26 19 11

15 1 5

Page 108: CHAPTER  6

108

6.8 히프 정렬 (heap sort)( 계속 )

heap 정렬 알고리즘에 따른 heap 상태 변환 과정

37

61

48 59

26 19 11

15 1 5

5

59

48 37

26 19 11

15 1

5

48

26 37

15 19 11

1

Page 109: CHAPTER  6

힙 알고리즘 분석 메모리 사용공간

원소 n 개에 대해서 n 개의 메모리 공간 사용 크기 n 의 힙 저장 공간

연산 시간힙 재구성 연산 시간

– n 개의 노드에 대해서 완전 이진 트리는 log2(n+1)

의 레벨을 가지므로 완전 이진 트리를 힙으로 구성하는 평균시간은 O(log2n)

– n 개의 노드에 대해서 n 번의 힙 재구성 작업 수행

평균 시간 복잡도 : O(O(n n loglog22nn))

6.7 히프 정렬