정렬 알고리즘의 성능 분석

13
정정 정정정정정 정정 정정 [DevRookie] 정정정정

Transcript of 정렬 알고리즘의 성능 분석

Page 1: 정렬 알고리즘의 성능 분석

정렬 알고리즘의 성능 분석[DevRookie] 꽝매니아

Page 2: 정렬 알고리즘의 성능 분석

차례 주의사항 선택 정렬 버블 정렬 삽입 정렬 병합 정렬 퀵 정렬 힙 정렬 기타 정렬 알고리즘 정리 결론 참고

Page 3: 정렬 알고리즘의 성능 분석

주의사항

기본적인 알고리즘 설명은 앞에서 했으므로 패스 . 점근적 분석은 성능을 예측하기 위한 하나의

수단 실제 처리상에서의 예외가 존재 ( PC 환경 등 ) 실제 대입 , 가감 연산 등의 배제에 주의 ( 상수 ) 비교 연산 위주의 성능 분석 수식 보다는 원리를 중심으로 이해

Page 4: 정렬 알고리즘의 성능 분석

선택 정렬 (SELECTION SORT)

수행시간 : (n-1)+(n-2)+···+2+1 = O(n^2)Worst & AverageSwap 횟수가 적을 가능성이 크다 .( 비교 연산 1 번에 O(1) )

Page 5: 정렬 알고리즘의 성능 분석

버블 정렬 (BUBBLE SORT)

수행시간 : (n-1)+(n-2)+···+2+1 = O(n2)Worst & AverageSwap 횟수가 많을 가능성이 크다 !( 비교연산 1 회에 최악의 경우 n-1 횟수 발생 )

Page 6: 정렬 알고리즘의 성능 분석

삽입 정렬 (INSERTION SORT)

수행시간 : O(n2)Worst case: 1+2+···+(n-2)+(n-1) = O(n^2)Average case: ½ (1+2+···+(n-2)+(n-1)) = O(n^2)여분의 공간을 필요로 하지만 , 비교적 중간 정렬된배열에서 좋은 성능을 발휘

Page 7: 정렬 알고리즘의 성능 분석

병합 정렬 (MERGE SORT)mergeSort(A[ ], p, r)▷ A[p ... r] 을 정렬한다{if (p < r) then {q ← (p+q)/2; ----------------------- ① ▷ p, q 의 중간 지점 계산 (내림 )mergeSort(A, p, q); ---------------- ② ▷ 전반부 정렬mergeSort(A, q+1, r); -------------- ③ ▷ 후반부 정렬merge(A, p, q, r); ------------------ ④ ▷ 병합

}}merge(A[ ], p, q, r){정렬되어 있는 두 배열 A[p ... q] 와 A[q+1 ... r] 을 합하여정렬된 하나의 배열 A[p ... r] 을 만든다 .}

최악의 경우 : O(nlogn)단조증가함수 : 큰 입력에 대해 수행시간보다 작은입력에 대해 수행되는 시간 이상 소요된다 .( 입력개수가 많을수록 수행시간이 오래 걸린다 .)

Page 8: 정렬 알고리즘의 성능 분석

퀵 정렬 (QUICK SORT)quickSort(A[], p, r) ▷ A[p ... r] 을 정렬한다{if (p < r) then {q = partition(A, p, r); ▷ 분할quickSort(A, p, q-1); ▷ 왼쪽 부분배열 정렬quickSort(A, q+1, r); ▷ 오른쪽 부분배열 정렬

}}partition(A[], p, r){배열 A[p ... r] 의 원소들을 A[r] 을 기준으로 양쪽으로 재배치하고A[r] 이 자리한 위치를 return 한다 ;}

평균적으로 Theta(nlogn), 하지만 최악의 경우 ( 불균등분할시 ) (n(n-1))/2 = O(n^2) 도 가능함 .평균적으로 1.39nlogn 회 비교 수행 . ( 최선의 경우에 비해 39% 정도만 느림 .)

퀵정렬이 병합 정렬보다 최악의 경우 더 느릴수 있지만 , 최악의 경우가 될 확률 이 적다 .

Page 9: 정렬 알고리즘의 성능 분석

힙 정렬 (HEAP SORT)• Heap– Complete binary tree 로서 다음의 성질을 만족한다• 각 노드의 값은 자신의 children 의 값보다 크지 않다• Heapsort– 주어진 배열을 힙으로 만든 다음 , 차례로 하나씩 힙에서제거함으로써 정렬한다

heapSort(A[ ], n){buildHeap(A, n); ▷ 힙 만들기for i ← n downto 2 {A[1] ↔ A[i]; ▷ 교환heapify(A, 1, i-1);

}}

최악의 경우에도 O(nlogn) 시간 소요 !

Page 10: 정렬 알고리즘의 성능 분석

쉬어 갑니다 .

일반적으로 알려진 정렬의 성능분석 발생 경우에 따른 확률 근거 ( 도박처럼… ) 위 경우는 일반적인 경우 . 특수한 상황에 따라 더 빠른 알고리즘을 쓸 수도

있다 .

Page 11: 정렬 알고리즘의 성능 분석

기타 알고리즘 정리

기수 정렬 계수 정렬 버킷 정렬 퀵 소트 등 Divide&Conquer 전략을 사용시

적절한 분할 알고리즘도 생각해 보자 .

Page 12: 정렬 알고리즘의 성능 분석

결론 및 정리

평균적인 경우와 발생 확률 정도를 예측 현재 가지고 있는 입력구조 분석 Divide&Conquer 할수록 logn 으로 줄일수

있다 . 탐색에 대한 성능 분석도 마찬가지 . n^2 , nlogn , n 차이지만 크기가 클수록 심화 . Swap, 삽입 , 삭제 등 숨겨진 비용 유추

Page 13: 정렬 알고리즘의 성능 분석

참고

Introduction to Algorithms 2nd (MIT Press, 한빛 )

뇌를 자극하는 알고리즘 ( 한빛 ) 쉽게 배우는 알고리즘 ( 한빛 )