알고리즘 (3): 쉘 정렬, 힙 정렬
쉘 정렬 (Shell Sort)
멀리 떨어진 원소끼리 교환하여 정렬 속도를 향상시키는 정렬 알고리즘
삽입 정렬을 변형하여 병렬 처리로서 정렬을 수행한다.
교환할 원소들의 Gap을 서서히 줄여가면서 최종적으로 i번째 인덱스와 i+1번째 인덱스의 교환들로 정렬이 마무리된다.
최대 Gap의 크기를 어떻게 설정하는 가, gap이 1까지 줄어드는 과정에 따라 수행시간이 변화한다.
최대 gap의 크기는 2~3개의 원소를 비교하도록 설정하고 비교한 결과단위를 합쳐서 다시 검사하는 Divide & Conquer 방식을 사용한다면 비교회수는 $N^{1.5}$를 넘지 않아 빠른 수행시간을 갖는다는 장점이 있다.
1 | //shellsort 알고리즘 |
힙 정렬(HeapSort)
힙을 이용해 정렬하는 알고리즘
힙은 자식과 부모간의 대소관계 규칙을 갖는 우선 순위 큐(Priority Queue)의 일종
루트 노드는 오름차순/내림차순 정렬의 최우선 값을 갖는다.
루트 노드를 가져오고 삭제하면서 자식 노드들 중 최대/최소 값을 계산하여 루트노드로 변경하는 작업을 통해 힙의 규칙을 유지
리스트의 수만큼 루트노드를 꺼내어 순서대로 리스트를 형성하면 정렬된 리스트를 얻을 수 있음
힙은 부모-자식간의 규칙이 있지만 같은 깊이의 노드들에 대해 규칙이 존재하지 않는다. 따라서 같은 값에 대해 입력순서가 지켜지지 않아 불안정적이다.
같은 깊이의 노드들은 $2^{깊이}$ 만큼의 노드를 가질 수 있다. 정렬시 자식과의 비교만이 이루어지므로 N개의 원소의 정렬에 대하여 $N \log{N}$의 수행시간을 갖는다.
1 | //힙정렬 알고리즘 |