2. 차례 주의사항 선택 정렬 버블 정렬 삽입 정렬 병합 정렬 퀵 정렬 힙 정렬 기타 정렬 알고리즘 정리 결론 참고
3. 주의사항 기본적인 알고리즘 설명은 앞에서 했으므로 패스. 점근적 분석은 성능을 예측하기 위한 하나의 수단 실제 처리상에서의 예외가 존재( PC 환경 등) 실제 대입, 가감 연산 등의 배제에 주의(상수) 비교 연산 위주의 성능 분석 수식 보다는 원리를 중심으로 이해
4. 선택 정렬(selection sort) 수행시간: (n-1)+(n-2)+···+2+1 = O(n^2) Worst & Average Swap 횟수가 적을 가능성이 크다.(비교 연산 1번에 O(1) )
5. 버블 정렬(bubble sort) 수행시간: (n-1)+(n-2)+···+2+1 = O(n2) Worst & Average Swap 횟수가 많을 가능성이 크다! (비교연산 1회에 최악의 경우 n-1 횟수 발생)
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) 여분의 공간을 필요로 하지만, 비교적 중간 정렬된 배열에서 좋은 성능을 발휘
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) 단조증가함수 : 큰 입력에 대해 수행시간보다 작은입력에 대해 수행되는 시간 이상 소요된다. (입력개수가 많을수록 수행시간이 오래 걸린다.)
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%정도만 느림.) 퀵정렬이 병합 정렬보다 최악의 경우 더 느릴수 있지만, 최악의 경우가 될 확률 이 적다.
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) 시간 소요!
10. 쉬어 갑니다. 일반적으로 알려진 정렬의 성능분석 발생 경우에 따른 확률 근거 (도박처럼…) 위 경우는 일반적인 경우. 특수한 상황에 따라 더 빠른 알고리즘을 쓸 수도 있다.
11. 기타 알고리즘 정리 기수 정렬 계수 정렬 버킷 정렬 퀵 소트 등 Divide&Conquer전략을 사용시 적절한 분할 알고리즘도 생각해 보자.
12. 결론 및 정리 평균적인 경우와 발생 확률 정도를 예측 현재 가지고 있는 입력구조 분석 Divide&Conquer할수록 logn으로 줄일수 있다. 탐색에 대한 성능 분석도 마찬가지. n^2 , nlogn , n 차이지만 크기가 클수록 심화. Swap, 삽입, 삭제 등 숨겨진 비용 유추
13. 참고 Introduction to Algorithms 2nd (MIT Press, 한빛) 뇌를 자극하는 알고리즘(한빛) 쉽게 배우는 알고리즘(한빛)