48
1 9장. 정렬 알고리즘 정렬 알고리즘 가장 많이, 그리고 가장 잘 알려진 알고리즘 방법과 효율 빅 오 기호로 분석 학습목표 정렬 알고리즘의 분류방법을 이해한다. 정렬 알고리즘 별로 작동원리에 대해 이해한다. 정렬 알고리즘 별로 효율분석 방법을 이해한다. 정렬 알고리즘에 따라 효율을 개선하기 위한 방법을 이해한다.

정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

1

9장. 정렬 알고리즘

정렬알고리즘가장많이, 그리고가장잘알려진알고리즘

방법과효율

빅오기호로분석

학습목표정렬알고리즘의분류방법을이해한다.

정렬알고리즘별로작동원리에대해이해한다.

정렬알고리즘별로효율분석방법을이해한다.

정렬알고리즘에따라효율을개선하기위한방법을이해한다.

Page 2: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

2

Section 01 정렬의 분류 - 정렬의 분류

정렬정렬의대상 = 레코드

정렬의기준 = 정렬키(Sort Key) 필드

오름차순, 내림차순오름차순: 키크기가증가하는순

내림차순: 키크기가감소하는순

[그림 9-1] 오름차순, 내림차순

Page 3: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

3

내부정렬, 외부정렬내부정렬

정렬대상을한꺼번에메인메모리에올릴수있을때

외부정렬

정렬대상을한꺼번에메인메모리로올릴수없을때

메인메모리와보조메모리사이를들락날락하면서정렬

정렬의 분류

Page 4: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

4

안정정렬(Stable Sorting)과불안정정렬(Unstable Sorting)

1차키: 학점

2차키: 학년

1차키로정렬하더라도이전의

2차키정렬순서가유지됨

정렬의 분류

성명 학년 학점 주소지

김용태 1 C 대구

정지희 1 B 서울

유일근 1 A 서울

박하영 3 B 전주

정건호 3 C 인천

김무성 3 A 수원

최석 4 A 용인

성명 학년 학점 주소지

김무성 3 A 수원

최석 4 A 용인

유일근 1 A 서울

박하영 3 B 전주

정지희 1 B 서울

김용태 1 C 대구

정건호 3 C 인천

성명 학년 학점 주소지

유일근 1 A 서울

김무성 3 A 수원

최석 4 A 용인

정지희 1 B 서울

박하영 3 B 전주

김용태 1 C 대구

정건호 3 C 인천

[표 9-3] 안정 정렬[표 9-2] 불안정정렬

[표 9-1] 신상 정보

Page 5: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

5

직접정렬(Direct Sorting)과간접정렬(Indirect Sorting)

입력

직접정렬

간접정렬

정렬의 분류

인덱스 0 1 2

레코드 김모 90 박모 50 최모 70

인덱스 0 1 2

레코드 박모 50 최모 70 김모 90

0 1 2

인덱스 0 1 2

0 1 2

인덱스 1 2 0

[표 9-6] 인덱스데이터 [표 9-7] 간접 정렬

[표 9-4] 입력 레코드

[표 9-5] 직접 정렬

Page 6: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

6

Section 02 선택 정렬 - 선택정렬

가장큰것을선택하여가장마지막것과스와핑

22 37 15 19 12

22 12 15 19 37

19 12 15 22 37

15 12 19 22 37

12 15 19 22 37

[그림 9-2] 선택 정렬

Page 7: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

7

코드 9-1: 선택정렬void Selection(int A[ ], int N) A는배열이름, N은정렬대상레코드수

{ for (int Last = N-1; Last >= 1; --Last) 마지막인덱스를왼쪽으로이동하면서{ int Largest = 0; 일단처음것이가장크다고보고

for (int Current=1; Current<=Last; Current++) 처음부터마지막까지{ if (A[Current] > A[Largest]) 현재것이더크면

Largest = Current; 현재인덱스를가장큰레코드의인덱스로}

int Temp = A[Last]; 이동을위해마지막레코드를잠시저장A[Last] = A[Largest]; 가장큰레코드를마지막으로이동A[Largest] = Temp; 마지막것을가장큰레코드위치로이동

}

}

if 문: (N-1) + (N-2) + ... + 1 = (N-1)N/2 번실행, 비교와할당으로구성

기타할당문: 4(N-1)

효율: 2(N-1)N/2 + 4(N-1) = N2 + 3N - 4 = O(N2)

대략적분석: 왼쪽위의삼각형면적이비교의횟수임. O(N2/2) = O(N2)

선택정렬의 효율

Page 8: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

8

한번의스캔에최대치와최소치를동시에발견하고스와핑MinMax Sorting

O(N2/2) = O(N2)

단계의수가반으로감소

계수를줄이는노력

이중 선택정렬

[표 9-8] 이중 선택 정렬

13 40 15 12 35 14 19 17

1단계결과 12 17 15 13 35 14 19 40

2단계결과 13 15 17 19 14 35

3단계결과 14 17 15 19

4단계결과 15 17

Page 9: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

9

Section 03 버블 정렬 - 버블정렬

버블정렬

Page 10: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

10

버블정렬

가장큰레코드가한칸씩오른쪽끝으로떠올라오는정렬

한쌍씩비교하되이전쌍의둘째레코드가다음쌍의첫레코드가되게중복

[그림 9-4] 버블 정렬

Page 11: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

11

단계수데이터 N개라면버블정렬의단계수는대략 N. 어떤단계에서스와핑이한번도일어나지않았다면 (이어지는한쌍끼리모두) 정렬완료된것임.

코드 9-2: 버블정렬

void Bubble(int A[ ], int N) A는배열이름, N은정렬대상레코드수

{ bool Sorted = FALSE; 스와핑이전혀없는단계에서빠져나가기위한변수

for (int Pass = 1; (Pass < N) && (!Sorted); ++Pass)

{ Sorted = TRUE; 스와핑이전혀없다고초기화

for (int Current=0; Current<N-Pass; ++Current)

{ if A[Current] > A[Current+1] 현재것이다음것보다크면

{ int Temp = A[Current]; 스왑

A[Current] = A[Current+1];

A[Current+1] = Temp;

Sorted = FALSE; 스왑이한번이라도일어나면다음단계로

]

안쪽루프내부의명령은 (N-1) + (N-2) + ... + 1 = (N-1)N/2 번수행. 루프내부의비교문은 (N-1)N/2 번. 할당문각각이 (N-1)N/2 번.

최종효율 (N-1)N/2 + 2(N-1)N = O(N2)

버블정렬

Page 12: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

12

버블정렬, 선택정렬

단계단계별로가장큰것이가장오른쪽으로이동한다는점에서동일

선택정렬은가장큰것과가장오른쪽것이한번에스와핑.

버블정렬은가장큰것이한칸씩오른쪽으로이동

스와핑(교환, 복사)에걸리는시간

큰레코드에대해서버블정렬은선택정렬보다불리

이미정렬된데이터버블정렬이최선의효율

1단계에서끝남. (스와핑이전혀없음). O(N)의효율

선택정렬은여전히 O(N2)의효율.

가장큰데이터인마지막데이터가자기자신과스왑(Self Swap)

Page 13: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

13

[그림 9-5] 삽입 정렬

Section 04 삽입 정렬 - 삽입정렬

왼쪽정렬된그룹을점차키워간다.

1 단계:가장왼쪽첫레코드하나만주목. 그자체로정렬

2 단계: 다음레코드를 왼쪽것과비교. 37은 22보다크므로그대로둠.

3 단계: 15는 37의왼쪽으로가야한다.

풀스왑: 삽입할레코드가계속적으로왼쪽으로옮김

하프스왑: 삽입될레코드는단한번만움직임

Page 14: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

14

코드 9-3: 삽입정렬void Insertion(int A[ ], int N)

{ for (int Pick=1; Pick<N; ++Pick) 왼쪽부터카드를하나씩집어내면서{ int Current = Pick; 집어낸카드의인덱스를현재인덱스로

for (; (Current > 0) && (A[Current-1]>A[Pick]); --Current)

A[Current] = A[Current-1]; 집어낸카드보다크면오른쪽으로이동A[Current] = A[Pick]; 집어낸카드를제위치에삽입 (하프스왑)

}

}

효율안쪽루프명령문은 1 + 2 + ... + (N-1) = (N-1)N/2 번실행for 문자체에비교 2번, 할당 1번, for 문내부에할당이 1번총 4(N-1)N/2 = 2(N-1)N = O(N2)

이미정렬된데이터에대해삽입정렬은최선의효율

이미정렬된기존사원 2000명, 신입사원 10명. 신입사원파일을기존사원파일에붙인이후삽입정렬. 2, 000명은이미정렬되어있으므로 O(N)

신입사원은최악의경우배열의맨앞까지가면서비교와스왑. 이작업은 10명에불과하므로 10N의시간. 따라서전체적인효율은 O(N) + O(10N) = O(N)

삽입정렬의 효율

Page 15: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

15

선택, 버블, 삽입

[표 9-9] 기본 정렬 방식의효율

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

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

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

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

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

안정정렬 No Yes Yes

Page 16: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

16

Section 05 셀 정렬 - 셸 정렬

셀정렬

[그림 9-6] 삽입 정렬과 셸 정렬

Page 17: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

17

삽입정렬을개선. 한칸씩이동하는하는대신한번에여러칸이동

4-정렬의예

일련의 h-정렬최종적으로는 1-정렬. 효율은 O(N3/2). 삽입정렬의 O(N2)보다는빠르지만O(NlogN)보다는느린효율

셸 정렬

[그림 9-8] h-정렬의필요성

[그림 9-7] 4-정렬

Page 18: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

18

Section 06 합병 정렬 - 합병

합병

Page 19: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

19

합병

정렬된그룹의합병

Page 20: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

20

코드 9-4: 합병함수void Merge(dataType A[ ], int F, int Mid, int L) F, Mid, L은그룹분리를위한인덱스

{ dataType Temp[MAX]; dataType의배열데이터를가정

int First1 = F; int Last1 = Mid; F부터 Mid까지가첫그룹

int First2 = Mid + 1; int Last2 = L; (Mid+1)부터 L까지가둘째그룹

int Index = First1;

for (; (First1 <= Last1) && (First2 <= Last2); ++Index) 그룹인덱스가밖으로안나갈동안

{ if (A[First1] < A[First2]) 첫그룹의데이터가작으면

{ Temp[Index] = A[First1]; 임시저장공간에복사

++First1; 포인터를이동

}

else 둘째그룹의데이터가작거나같으면

{ Temp[Index] = A[First2]; 임시저장공간에복사

++First2; 포인터를이동

}

}

for (; First1 <= Last1; ++First1, ++Index) 첫그룹에남은데이터가있으면

Temp[Index] = A[First1]; 순서대로임시저장공간에복사

for (; First2 <= Last2; ++First2, ++Index) 둘째그룹에남은데이터가있으면

Temp[Index] = A[First2]; 순서대로임시저장공간에복사

for (Index = F; Index <= L; ++Index) 임시저장공간의데이터를

A[Index] = Temp[Index]; 원래배열로복사시킴

}

합병함수

Page 21: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

21

코드 9-5: 합병정렬의메인함수void MergeSort(int A[ ], int First, int Last)

{ if (First < Last)

{ int Middle = (First + Last) / 2;

MergeSort(A, First, Middle);

MergeSort(A, Middle+1, Last);

Merge(A, First, Middle, Last);

}

}

합병정렬반잘라서왼쪽재귀호출, 오른쪽재귀호출. 결과를합병

베이스케이스로부터빠져나와호출함수로되돌아오는과정에서 Merge(A,

First, Middle, Last) 즉, 합병에의해정렬

합병정렬 메인함수

Page 22: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

22

합병정렬들어가고나오기

합병정렬 들어가고 나오기

[그림 9-11] 합병 정렬의실행 과정

Page 23: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

23

효율O(NlgN)

호출의단계수가 lgN

각단계별로합병에 O(N)

합병정렬의 효율

[그림 9-11] 합병 정렬의실행 과정

Page 24: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

24

삽입정렬과 합병정렬

효율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분

수퍼컴퓨터 순간적 순간적 순간적[표 9-11] 합병 정렬(O(NlgN))

[표 9-10] 삽입 정렬(O(N2))

Page 25: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

25

Section 07 쾌속 정렬 - 쾌속

쾌속

Page 26: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

26

쾌속정렬

합병정렬과쾌속정렬재귀호출의순서에유의

실제정렬작업이어디서일어나는지유의

MergeSort

{ MergeSort (Left);

MergeSort (Right);

Merge;

}

QuickSort

{ Partition;

QuickSort(Left);

QuickSort(Right);

}

[표 9-12] 합병 정렬과쾌속 정렬 비교

Page 27: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

27

쾌속정렬

코드 9-6: 파티션함수

int partition(int A[ ], int first, int last)

{ int low, high, pivotindex, p;

p = A[last]; 마지막요소를피벗으로

low = first; 업포인터를처음으로

high = last-1; 다운포인터를마지막직전요소로

while (low < high) 크로스오버가없을때까지

{ while (p > A[low]) low++; 피벗보다크거나같은것찾기

while (p < A[high]) high--; 피벗보다작거나같은것찾기

if (low < high) 크로스오버가아니면

Swap(A, low, high); 작은것과큰것을스왑

}

Swap(A[low], A[last]); 업포인터레코드와피벗레코드를스왑

return (low); 피벗인덱스를리턴

}

Page 28: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

28

코드 9-7: 쾌속정렬의메인함수

void QuickSort(int A[ ], int First, int Last)

{ if (First < Last)

{ int PivotIndex = Partition(A, First, Last);

QuickSort(A, First, PivotIndex-1);

QuickSort(A, PivotIndex+1, Last);

}

}

쾌속정렬 메인함수

[그림 9-14] 쾌속 정렬

Page 29: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

29

쾌속정렬

효율단계의수에따라결정

단계의수는파티션결과좌우정확히양분되면 lgN

균형(Balancing)이좋을때효율은 O(NlgN0

정렬된데이터에최악의효율파티션결과하나씩만나가떨어진

단계의수는거의 N

[그림 9-15] 정렬된 데이터

Page 30: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

30

쾌속정렬의 균형

파티션방법더나은균형을위하여같은키에서도스와핑

피벗의선택 (“세개중메디안”파티션)처음세개, 마지막세개, 처음, 마지막, 중간것

랜덤함수에의한추출

어느경우든선택을위한시간이소요됨.

시스템정렬샘플정렬

램덤하게여러샘플추출, 정렬, 그중중간값을피벗으로

벤틀리매클로이방식

한번에 3개의샘플을사용하여메디안을구함

3번반복하여 3개의메디안을구한뒤, 그중의메디안값을피벗으로

파티션의최종단계예를들어데이터 10개이하

직접삽입정렬에의해정렬

재귀호출에따른활성화레코드 생성,복원에따르는시간배제

Page 31: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

31

합병정렬, 쾌속정렬

효율비교합병정렬은매단계마다완벽한균형

합병정렬은최악의경우에도 O(NlgN)을보장

쾌속정렬은최악의경우 O(N2)

쾌속정렬은임시저장공간이불필요한제자리연산(In-Place Computation)

합병정렬은임시저장공간에옮겨가고옮겨오는시간이필요

평균적으로는쾌속정렬이빠름

Page 32: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

32

합병정렬

쾌속정렬

삽입, 쾌속, 합병

정렬방식 비교

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[표 9-15] 정렬 방식의비교

[표 9-13] 합병 정렬(O(NlgN))

[표 9-14] 쾌속 정렬(O(NlgN))

Page 33: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

33

Section 08 외부 정렬- 외부정렬

기본적으로합병정렬입력파일: D A T A S T R U C T U R E A N D A L G O R I T H M

메인메모리용량이세개단위로읽어들여정렬가능하다고가정

1단계:

파일 1: ADT * RTU * GOR *

파일 2: AST * AEN * HIT *

파일 3: CRU * ADL * M *

2단계: (3개씩합병)

파일 4: AACDRSTTU *

파일 5: AADELNRTU *

파일 6: GHIMORT *

3단계: (3개씩합병)

파일 1: AAAACDDEGHILMNORRSTTTTUU *

Page 34: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

34

1단계: 파일 1: ADT * RTU * GOR *

파일 2: AST * AEN * HIT *

파일 3: CRU * ADL * M *

2단계: (2개씩합병)파일 4: AADSTT * AADELN * M

파일 5: CRRTUU * GHIORT *

3단계: (2개씩합병)파일 1: AACDRRSTTTUU * M

파일 2: AADEGHILNORT *

4단계:(2개씩합병)파일 3: AAAACDDEGHILNORRSTTTTUU *

파일 4: M

5단계(2개씩합병)파일 1: AAAACDDEGHILMNORRSTTTTUU *

외부정렬

Page 35: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

35

합병모든블록이합병에참가하기만하면합병의순서는관계없음

효율CPU 연산시간 << 입출력시간

외부정렬의효율은입출력시간에좌우됨

몇단계에걸쳐파일출력이일어나는가가관건

1 단계실행결과정렬된블록의개수는 N/M 개

p개단위의합병합병한번에블록의개수는 1/p 씩줄어듬

따라서정렬의효율은대략 logp(N/M)

외부정렬

Page 36: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

36

버블정렬의결정트리3개의키이므로크기순서의조합은 3! = 6

불필요한비교를감안하면일반적으로리프노드의수는 N! 개이상

트리의높이는최소한 log2(N!) 보다크고최소비교의회수는 log2(N!).

스털링(Stirling)의공식: log2(N!) ≥ log2(N/e)N = Nlog2N - Nlog2e.

따라서정렬에서가능한최소비교회수는 Nlog2N

Section 09 최선의 정렬 효율 - 최선의 정렬효율

[그림 9-16] 버블 정렬의결정 트리

Page 37: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

37

Section 10 버켓 정렬과 셈 정렬 - 버켓정렬

버켓정렬

Page 38: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

38

버켓정렬

방법키자체를배열인덱스로하여별도배열로옮김

효율O(N). 키비교에의한정렬이아니므로 O(NlgN)을능가할수있음

단점버켓배열의인덱스보다큰키가들어올수없음버켓의크기를최대인덱스크기로설정. 메모리공간낭비가능성이를개선한것이셈정렬

[그림 9-18] 버켓 정렬

Page 39: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

39

셈 정렬

분포세기(Distribution Counting) 또는셈정렬(Count Sorting)

중복키허용키빈도를 Count[ ] 배열에넣음. Count[1]= 4, Count[2] = 2, Count[3] = 1

누계를구하면 Count[1] = 4, Count[2] = 4 + 2 = 6, Count[3] = 6 + 1 = 7

오른쪽에서왼쪽으로스캔해가면서버켓에삽입삽입위치는현재의카운트값. 삽입직후에는카운트값을하나씩줄임

효율O(N)로서안정정렬

[그림 9-19] 셈 정렬

Page 40: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

40

Section 11 기수 정렬 - 기수정렬

[그림 9-20] 문자열 키의 분해

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

Page 41: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

41

기수정렬

기수정렬Radix = 뿌리

문자열키의뿌리는문자. 문자의뿌리는비트

문자열단위로비교하는대신문자열을잘라서문자단위로비교

기수8비트ASCII 코드라면 256가지레이딕스

16비트유니코드(Unicode)라면 65,536 가지의레이딕스

숫자를문자열로간주하면숫자키에대해서도기수정렬을가할수있음.

Page 42: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

42

LSD

문자열오른쪽(Least Significant Digit )에서왼쪽으로

제대로동작하는이유는안정성때문. 왼쪽키가같다면오른쪽키는이전에정렬된순서를유지함

문자단위의정렬은셈정렬을사용

문자열길이W일때, 효율은 O(WN)

LSD 기수정렬

[그림 9-21] A [그림 9-22] B [그림 9-23] C [그림 9-24] D

0 a d d

1 c a b

2 f e e

3 b a d

4 d a d

5 b e e

6 b e d

7 a c e

0 c a b

1 a d d

2 b a d

3 d a d

4 b e d

5 f e e

6 b e e

7 a c e

0 c a b

1 b a d

2 d a d

3 a c e

4 a d d

5 b e d

6 f e e

7 b e e

0 a c e

1 a d d

2 b a d

3 b e d

4 b e e

5 c a b

6 d a d

7 f e e

Page 43: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

43

LSD 기수정렬

단점최종단계의정렬이이루어지기전까지는조금이라도정렬된흔적이없음

가변길이키에적용하기어려움.

cold 와 old 라는키에이방식을가하면뒤에서부터올라오므로마지막첫자리에서 cold의 c와비교되어야하는것이 old에는없으므로아무것도없음을표시하는널문자(Null Character)와비교.

ASCII 코드표에의하면 c는십진수 99, 널문자는십진수 0이므로 old, cold 순의오름차순이된다. 이는잘못된정렬

마지막부근의자릿수정렬에많은시간을허비. 만약키가 Kim Pak Cho Rho 등이라면사실은첫자리만보고도정렬이가능한것이다.

패딩cold, old, at를비교하자면 cold, old0, at00 등으로마지막에 0을보충

0은아스키값십진수 47로서문자보다는그값이작음

숫자를문자열로취급할경우에는거꾸로처음에 0을넣어서비교

1611, 315, 17을비교하자면 1611, 0315, 0017로비교

패딩은번거로운작업으로서키의최대길이를찾아내는시간, 패딩하는시간을요한다.

Page 44: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

44

MSD 기수정렬

MSD

왼쪽 (MSD: Most Significant Digit) 에서오른쪽으로진행

셈정렬(Distribution Counting)을사용. O(WN) = O(N)

이전의모든문자가일치하는것들만다음문자를비교

앞부분이유일(Uniqueness) 해지면더이상비교대상에서제외

0 a d d

1 c a b

2 f e e

3 b a d

4 d a d

5 b e e

6 b e d

7 a c e

0 a d d

1 a c e

2 b a d

3 b e e

4 b e d

5 c a b

6 d a d

7 f e e

0 a c e

1 a d d

2 b a d

3 b e e

4 b e d

5 c a b

6 d a d

7 f e e

0 a c e

1 a d d

2 b a d

3 b e d

4 b e e

5 c a b

6 d a d

7 f e e

[그림 9-25] D [그림 9-26] E [그림 9-27] F [그림 9-28] G

Page 45: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

45

기수교환 정렬

기수교환정렬문자단위의정렬에셈정렬대신쾌속정렬사용

별도메모리대신스와핑사용

3-way 파티션

피벗 b와일치하지않는키(add, ace 그룹, dad, fee, cab 그룹)는다시첫문자를기분으로재귀적으로정렬해야함.

피벗 b와일치하는키(bed, bad, bee)는두번째문자를대상으로정렬을진행

[그림 9-30] I

0 a d d

1 c a b

2 f e e

3 b a d

4 d a d

5 b e e

6 b e d

7 a c e

0 a d d

1 a c e

2 b e d

3 b a d

4 b e e

5 d a d

6 f e e

7 c a b

[그림 9-29] H

Page 46: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

46

비트단위의 기수교환정렬

파티션파티션결과 0인그룹과 1인그룹으로양분

첫문자에재귀적으로파티션할필요가없음

비트단위의쾌속정렬

비트열이유일(Uniqueness)해지면더이상비교대상에서제외시킴

[그림 9-31] 비트 단위의기수교환정렬

Page 47: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

47

비트 단위의 기수교환 정렬

유일한비트열파티션이가해질때마다N개의비트값이비교데이터 N 개라면대략적으로 log2N 비트만에모든비트열이유일해짐.

기수교환정렬의효율은O(Nlog2N)

통계적분석통계적으로볼때, 어떤자리수가 0일확률과 1일확률이 1/2로서동일비트단위의파티션을가하면데이터의반이 0 그룹, 나머지반이 1 그룹균형적파티션이므로단계의수는쾌속정렬에서지속적으로균형적인파티션이일어날때의단계수인 log2N과동일균형이일어날확률이높음으로인해쾌속정렬보다 O(Nlog2N)에근접

효율소요되는시간면에서비트단위의기수교환정렬은쾌속정렬과큰차이기수교환정렬에서 O(Nlog2N)이라고할때에는비트단위의비교회수쾌속정렬에서O(Nlog2N)라고할때에는문자열단위의비교회수

Page 48: 정렬알고리즘 - nlp.chonbuk.ac.krnlp.chonbuk.ac.kr/DS/ch09.pdf · 코드9-2: 버블정렬 void Bubble(int A[ ], int N) A ... 24 삽입정렬과합병정렬 효율 O(N2) 대O(NlgN)

48

Thank you