코드
#include <stdio.h>
#include <stdlib.h>
#define MAX_ELEMENT 200
typedef struct { // 정수 하나를 가지는 구조체 선언
int key;
}element;
typedef struct {
element heap[MAX_ELEMENT]; // 힙 배열 선언
int heap_size;
}HeapType;
// 생성 함수
HeapType* create() {
return (HeapType*)malloc(sizeof(HeapType)); // 포인터 동적 할당
}
// 초기화 함수
void init(HeapType* h) {
h->heap_size = 0; // 힙 사이즈 0으로 초기화
}
void insert_max_heap(HeapType* h, element item) {
int i;
i = ++(h->heap_size); // 힙 사이즈 1증가
// 트리를 거슬러 올라가면서 부모 노드와 비교하는 과정
while ((i != 1) && (item.key > h->heap[i / 2].key)) { // 1번지가 아니고 새로 삽입하는 key 값이 부모의 key값 보다 크다면
h->heap[i] = h->heap[i / 2];
i /= 2;
}
h->heap[i] = item; // h가 가리키고 있는 힙의 i번지에 새로운 노드를 삽입
}
element delete_max_heap(HeapType* h) {
int parent, child;
element item, temp;
item = h->heap[1]; // 루트 값 보관
temp = h->heap[(h->heap_size)--]; // 말단 노드 값 보관, 힙 사이즈 1감소
parent = 1;
child = 2;
while (child <= h->heap_size) { // 자식 노드가 전체 데이터의 노드 수 보다 같거나 작을 때
// 현재 노드의 자식노드 중 더 작은 자식노드를 찾는다.
if ((child < h->heap_size) &&
(h->heap[child].key) < h->heap[child + 1].key)
child++;
if (temp.key >= h->heap[child].key) break;
// 한 단계 아래로 이동
h->heap[parent] = h->heap[child];
parent = child;
child *= 2;
}
h->heap[parent] = temp; // 저장해 놓은 말단 노드를 부모 자리에 삽입
return item; // 루트 값 리턴
}
void print_heap(HeapType* h) {
for (int i = 1; i <= h->heap_size; i++)
printf("%3d", h->heap[i].key);
printf("\n");
}
// 힙 정렬
void heap_sort(element a[], int n) {
HeapType* h;
h = create();
init(h);
printf("\n\t--힙트리 생성--\n");
for (int i = 0; i < n; i++) {
insert_max_heap(h, a[i]);
print_heap(h);
}
printf("\n\t--힙정렬 수행--\n");
for (int i = (n - 1); i >= 0; i--) {
a[i] = delete_max_heap(h);
print_heap(h);
}
free(h); // h 반납
}
#define SIZE 8
int main(void) {
element list[SIZE] = { 23,56,11,9,56,99,27,34 }; // 힙은 동일한 값이 들어갈 수 있음
heap_sort(list, SIZE);
printf("\n\t--힙정렬 완료(오름차순 정렬)--\n");
for (int i = 0; i < SIZE; i++) {
printf("%3d", list[i].key);
}
printf("\n");
}
실행 결과
'ALGORITHM' 카테고리의 다른 글
[JAVA] 백준 25305번 - 커트라인 (0) | 2022.09.21 |
---|---|
[JAVA] 백준 10989번 - 수 정렬하기 3(카운팅 정렬) (0) | 2022.09.21 |
[JAVA] 백준 2751번 - 수 정렬하기2 (0) | 2022.09.20 |
[JAVA] 백준 2750번 - 수 정렬하기 (0) | 2022.09.20 |
[JAVA] 백준 1260번 - DFS와 BFS (0) | 2022.09.18 |