정렬 알고리즘
1. Bubble Sort(거품 정렬)
2. Selection Sort(선택 정렬)
3. Insertion Sort(삽입 정렬)
4. Quick Sort(퀵 정렬)
5. Merge Sort(병합 정렬)
6. Heap Sort(힙 정렬) ⇠
7. Radix Sort(기수 정렬)
8. Counting Sort(계수 정렬)
완전 이진 트리
삽입할 때 왼쪽부터 차례대로 추가하는 이진 트리
힙 소트가 유용할 때
과정
1. 정렬해야 할 n개의 요소들을 최대 힙(완전 이진 트리 형태)로 만든다. (내림차순을 기준으로 정렬)
2. 그 다음으로 한 번에 하나씩 요소를 힙에서 꺼내서 배열의 뒤부터 저장한다.
3. 삭제되는 요소들(최댓값부터 삭제)은 값이 감소되는 순서로 정렬되게 된다.
Max Heap 삽입 과정
Max Heap 삭제 과정
코드
private void solve() {
int[] array = { 230, 10, 60, 550, 40, 220, 20 };
heapSort(array);
}
public static void heapify(int[] array, int n, int i) {
int p = i;
int l = i * 2 + 1;
int r = i * 2 + 2;
if (l < n && array[p] < array[l]) {
p = l;
}
if (r < n && array[p] < array[r]) {
p = r;
}
if (i != p) {
swap(array, p, i);
heapify(array, n, p);
}
}
public static void heapSort(int[] array) {
int n = array.length;
// max heap 초기화
for (int i = n / 2-1; i >= 0; i--) {
/* 첫번째 heapify */
heapify(array, n, i);
}
// extract 연산
for (int i = n - 1; i > 0; i--) {
swap(array, 0, i);
/* 두번째 heapify */
heapify(array, i, 0);
}
}
public static void swap(int[] array, int a, int b) {
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
1번째 heapify
왼쪽 자식노드(i*2 + 1), 오른쪽 자식노드(i*2 + 2)이기 때문2번째 heapify
O(N)이다.logN이므로 하나의 요소를 힙에 삽입하거나 삭제할 때 힙을 재정비하는 시간이 logN만큼 소요된다. 요소의 개수가 N개 이므로 전체적으로 O(NlogN)의 시간이 걸린다.