본문 바로가기

data structure with C

Min Heap

728x90

다음 입력파일의 데이터를 사용하여 최소히프(Min Heap)에 대한 실습을 수행한다.

 

<input.txt>

10 40 30 5 12 6 15 9 60

 

① 파일입력을 받으면서 최소히프를 구성한다. (최대 입력 개수는 80개로 제한한다.)

매 입력마다, 구성된 최소히프의 배열원소를 인덱스 순서대로 출력한다.

 

② 최소히프의 최소값을 연속으로 원소개수만큼 삭제한다.

매 삭제마다, 재구성된 최소히프의 배열원소를 인덱스 순서대로 출력한다.

Example

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

enum {
	FILE_OPEN_ERROR
};

#define NAME(a) #a
#define CATCH(ERROR) do{printf(NAME(ERROR));exit(0);}while(false)
#define SWAP(type,x,y) do{type t=x;x=y;y=t;}while(false)

#define HEAP_SIZE 81
int min_heap[HEAP_SIZE];
int data_num = 0;

void min_heap_in(int data);
void print_min_heap(void);

int min_heap_out(void);

#define FILE_NAME "input.txt"
int main(void)
{
	FILE* fp;fopen_s(&fp, FILE_NAME, "r");
	int data;
	if (fp)
	{
		printf("< Insertion into Min Heap >\n");
		while (fscanf_s(fp, "%d", &data) != EOF)
		{
			min_heap_in(data);
			print_min_heap();
		}
		fclose(fp);
	}
	else CATCH(FILE_OPEN_ERROR);

	printf("< Deletion from a Min Heap >\n");
	while (data_num > 0)
	{
		printf("out data = %3d\n", min_heap_out());
		print_min_heap();
	}

	return 0;
}

void min_heap_in(int data)
{
	min_heap[++data_num] = data;

	int i;
	for (i = data_num; i > 1; i /= 2)
	{
		if (min_heap[i / 2] > min_heap[i])
			SWAP(int, min_heap[i / 2], min_heap[i]);
		else break;
	}
}

void print_min_heap(void)
{
	int i;
	for (i = 1; i <= data_num;i++)
		printf("%3d", min_heap[i]);
	printf("\n");
}

int min_heap_out(void)
{
	int result = min_heap[1];

	min_heap[1] = min_heap[data_num--];

	int child, parent;
	for (parent = 1; parent * 2 <= data_num;)
	{
		child = parent * 2;
		if (min_heap[child] > min_heap[child + 1]) child++;

		if (min_heap[child] < min_heap[parent])
			SWAP(int, min_heap[child], min_heap[parent]);
		else break;

		parent = child;
	}

	return result;
}
728x90

'data structure with C' 카테고리의 다른 글

Winner Tree  (0) 2020.12.29
Binary Search Tree  (0) 2020.12.29
Max Heap  (0) 2020.12.27
명제식 이진트리  (0) 2020.12.26
Binary Tree  (0) 2020.12.25