Baekjoon 2751 (수 정렬하기 2)

Baekjoon 2751 (수 정렬하기 2)

Baekjoon 2751, 백준 2751 문제의 본인 풀이입니다!
문제는 아래의 링크에서 확인할 수 있습니다.
문제 보기

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#define MAX_ELEMENT 1000010

typedef struct {
int heap[MAX_ELEMENT];
int heap_size;
} HeapType;

// 현재 요소의 개수가 heap_size인 힙 h에 data을 삽입한다.
void insert_heap(HeapType *h, int data) {
int i;
i = ++(h->heap_size); // 힙 크기를 하나 증가

// 트리를 거슬러 올라 가며 부모 노드와 비교하는 과정
// i가 루트 노드가 아니고,data 값이 부모노드(i/2)보다 작으면
while( (i!=1) && (data < h->heap[i/2])) {
h->heap[i] = h->heap[i/2];
i /= 2;
}
h->heap[i] = data;
}

int delete_heap(HeapType *h) {
if(h->heap_size == 0) return -1;

int ret = h->heap[1];
int temp = h->heap[(h->heap_size)--]; // 마지막 노드를 temp에 담고 heap_size를 1 줄임.
int parent = 1, child = 2;

while(child <= h->heap_size) {

// 현재 노드의 자식 노드 중 더 작은 자식 노드를 찾는다.
if( child < h->heap_size && h->heap[child] > h->heap[child+1] )
child++;

// 더 작은 자식 노드보다 마지막 노드가 작으면 while문 정지
if( temp <= h->heap[child] ) break;

// 그렇지 않으면, 부모 노드와 작은 자식 노드 교환
h->heap[parent] = h->heap[child];
parent = child;
child *= 2;
}

h->heap[parent] = temp;
return ret;
}

int main() {

int N, data;
scanf("%d",&N);
HeapType heap1;
heap1.heap_size = 0;

for(int i=0; i<N; i++){
scanf("%d",&data);
insert_heap(&heap1,data);
}

for(int i=0; i<N; i++) {
printf("%d\n", delete_heap(&heap1));
}

}

quick sort 등의 간편한 함수를 사용하지 않고, 직접 heap sort를 구현해 보았다.
while 문 내부의 if 문 조건이 하나 틀어져서 오류 찾는데 엄청 오래 걸렸다.

Author

Yeonsang Shin

Posted on

2020-03-13

Updated on

2022-12-19

Licensed under

Comments