-
9. 정렬 알고리즘 정리Algorithm 2019. 10. 16. 17:59
#정렬 알고리즘
Best Worst Average Stable In-place Selection Sort O(n*n) O(n*n) O(n*n) X O Bubble Sort O(n*n)/ O(n) O(n*n) O(n*n) O O Insertion Sort O(n) O(n*n) O(n*n) O O Quick Sort O(n log n) O(n*n) O(n log n) X X Merge Sort O(n log n) O(n log n) O(n log n) O X Heap Sort O(n log n) O(n log n) O(n log n) X O Merge Sort의 경우 병합할 때 O(n)의 스텍 메모리가 필요하다. // O(log n)
Quick Sort의 경우 O(n)의 stack 메모리가 필요하다. 하지만 pivot에 의해 분할된 부분 중 작은 부분을 먼저 정렬한다면 O(log n)으로 메모리를 줄일 수 있다.
#정렬 알고리즘의 하한계
두 원소를 비교해서 정렬하는 알고리즘에서 최악의 경우가 O(n log n)보다 적게 나오는 경우는 없다.
why?
모든 원소를 비교해서 나타내는 정렬 알고리즘은 원소 비교 하나에 대해 노드를 만들어 판단 트리로 나타낼 수 있다. 이 경우 판단 트리의 leaf노드는 n!개이며 leaf노드에는 각각의 경우에 대한 결과값이 존재해야 한다. 판단 트리를 이용한 삽입 정렬의 최악의 경우 비교횟수는 판단트리의 높이이다.
*m개의 leaf노드를 가지는 이진트리의 높이
-제일 큰 경우: 한쪽으로 치우친 경우
-제일 작은 경우: 완전이진트리
즉, [log m]==[log n!] <= h
log n! ≒ log(n/2)^(n/2) = (n/2) * log(n/2)
=> O((n/2) * log(n/2)) = O(n log n)
따라서 키 비교에 의한 정렬알고리즘에서는 Merge Sort, Heap Sort는 최악의 경우 최적의 알고리즘이라고 할 수 있다.
그렇다면 정렬을 할 때 꼭 원소를 비교해야 하는가? 그렇지 않다. 다음장부터 두 원소를 비교하지 않고 정렬하는 방법을 살펴볼 것이다.
'Algorithm' 카테고리의 다른 글
7. 힙 정렬(Heap Sort) (0) 2019.10.16 6. 분할과 정복_퀵정렬(Quick Sort) (0) 2019.10.04 5. 분할과 정복_병합정렬(Merge Sort) (0) 2019.10.04 4. 삽입 정렬(Insertion Sort) (0) 2019.10.04 3. 버블 정렬(Bubble Sort) (0) 2019.10.04