힙 정렬 : 힙 정렬은 힙 트리를 이용한 정렬입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
// 왼쪽 자식의 인덱스 = (부모의 인덱스) * 2
// 오른쪽 자식의 인덱스 = (부모의 인덱스) * 2 + 1
// 부모의 인덱스 = (자식의 인덱스) / 2
void heap(int* array, int size)
{
for (int i = 1; i < size; i++)
{
int child = i; // 힙은 최상위 부모 노트가 숫자 1부터 부여된다.
while (child > 0) // 최상위 부모 노트가 될 때까지 반복한다.
{
int root = (child - 1) / 2;
if (array[root] < array[child]) { // 자식이 부모보다 크다면 바꾸기.
int temp = array[root];
array[root] = array[child];
array[child] = temp;
}
child = root;
}
}
}
int main()
{
int array[10] = { 1, 9, 4, 10, 6, 2, 5, 3, 7, 8 };
heap(array, 11); // 힙을 만든다.
for (int i = 9; i >= 0; i--)
{
// i == 9
// 최상위 부모 노트와 맨 마지막 원소와 바꾸고
int temp = array[i];
array[i] = array[0];
array[0] = temp;
// 맨 마지막으로 간 최상위 노트를 제외하고 다시 힙을 정렬한다.
// 이렇게 하면 큰 숫자부터 계속 가져올 수 있다.
heap(array, i);
}
return 0;
}
|
'스터디 > 자료구조' 카테고리의 다른 글
[ 자료구조 ] Merge sort (0) | 2020.02.24 |
---|---|
[ 자료구조 ] Quick sort (0) | 2020.02.23 |
[ 자료구조 ] Insertion sort (0) | 2020.02.23 |
[ 자료구조 ] Bubble Sort (0) | 2020.02.23 |
[ 자료구조 ] Selection Sort (0) | 2020.02.23 |