ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

[ํž™ ์ƒ์„ฑ]

1. ์‚ฝ์ž…์‹ >> ๋ชจ๋“  ํ‚ค๋“ค์ด ๋ฏธ๋ฆฌ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ๋˜๋Š” ํ‚ค๋“ค์ด ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ ์ ์šฉ ๊ฐ€๋Šฅ

2. ์ƒํ–ฅ์‹ >> ๋ชจ๋“  ํ‚ค๋“ค์ด ๋ฏธ๋ฆฌ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ

 

 

1. ์‚ฝ์ž…์‹ ํž™ ์ƒ์„ฑ

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

int H[99]; // ํž™ ๋ฐฐ์—ด
int n = 0; // ํž™์˜ ํฌ๊ธฐ

void upHeap(int i) {// ket ์‚ฝ์ž… ํ›„ ์ •๋ ฌํ•˜๋Š” ํ•จ์ˆ˜
	int tmp;
	if (i == 1)
		return;

	if (H[i] <= H[i / 2]) // i๊ฐ€ root๊ฐ€ ์•„๋‹ ๋•Œ ๋ถ€๋ชจ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
		return;

	// i๊ฐ€ ๋ถ€๋ชจ๋…ธ๋“œ๋ณด๋‹ค ํฌ๋‹ค๋ฉด swapํ•ด์ฃผ๊ธฐ
	tmp = H[i];
	H[i] = H[i / 2];
	H[i / 2] = tmp;

	upHeap(i / 2);// ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ ๋ฐ”๊ผˆ์œผ๋‹ˆ๊นŒ ๋‹ค์‹œ ํ˜ธ์ถœํ•ด์„œ ๊ทธ ๋ถ€๋ชจ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋…ธ๋“œ์™€ ๊ฐ’ ๋น„๊ตํ•ด์ฃผ๊ธฐ
}

void downHeap(int i) {// ์ตœ๋Œ€ํž™ ๋ฐ˜ํ™˜ ํ›„ ์ •๋ ฌํ•˜๋Š” ํ•จ์ˆ˜
	int left = i * 2; //์™ผ์ชฝ ์ž์‹๋…ธ๋“œ ์ธ๋ฑ์Šค, i๋Š” 1๋กœ ํ˜ธ์ถœ๋๊ธฐ ๋•Œ๋ฌธ์— root
	int right = i * 2 + 1; // ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ ์ธ๋ฑ์Šค
	int max, tmp; //max๊ฐ’
	if (n < left && n < right)// ์ž์‹๋…ธ๋“œ๊ฐ€ ๋‘˜๋‹ค ์—†๋‹ค๋ฉด ๋ฐ˜ํ™˜
		return;

	max = left;// ์•„๋‹ˆ๋ผ๋ฉด max์— ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ์Œ
	if (n >= right) {// ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ๋„ ์žˆ๋‹ค๋ฉด
		if (H[max] < H[right]) {//๊ทธ๋ฆฌ๊ณ  ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ ๊ฐ’๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ ๊ฐ’์ด ํฌ๋‹ค๋ฉด
			max = right;// max์— ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅ
		}
	}

	if (H[max] <= H[i])// max์—๋Š” ์™ผ์ชฝ or ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ ์ธ๋ฑ์Šค๊ฐ€ ๋“ค์–ด์žˆ์Œ, ๊ทธ ๊ฐ’์ด root๊ฐ’๋ณด๋‹ค ์ ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋ฐ˜ํ™˜
		return;
	// ์•„๋‹ˆ๋ผ๋ฉด == ์™ผ์ชฝ or ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ ๊ฐ’์ด root๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฉด swap
	tmp = H[i];
	H[i] = H[max];
	H[max] = tmp;

	downHeap(max);
}

void insertItem(int key) {
	n += 1;
	H[n] = key;
	upHeap(n);
}

int removeMax() {//์ตœ๋Œ€ํž™ ๋ฐ˜ํ™˜ ๋ฐ ์‚ญ์ œ
	int key;
	key = H[1];
	H[1] = H[n];
	n -= 1;
	downHeap(1);

	return key;
}

void printHeap() {
	for (int i = 1; i <= n; i++) {
		printf(" %d", H[i]);
	}
	printf("\n");
}

int main() {
	char type;
	int key;

	while (1) {
		scanf("%c", &type);
		if (type == 'q')
			break;
		else if (type == 'i') {
			scanf("%d", &key);
			insertItem(key);
			printf("0\n");
		}
		else if (type == 'd') {
			printf("%d\n", removeMax());
		}
		else if (type == 'p') {
			printHeap();
		}
	}

	return 0;
}

 

 

2. ์ƒํ–ฅ์‹ ํž™ ์ƒ์„ฑ

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

int H[99]; // ํž™ ๋ฐฐ์—ด
int n; // ํž™์˜ ํฌ๊ธฐ

void downHeap(int i) {
	int left = i * 2;
	int right = i * 2 + 1;
	int max, tmp;
	if (n < left && n < right)
		return;

	max = left;
	if (n >= right) {
		if (H[max] < H[right]) {
			max = right;
		}
	}

	if (H[max] <= H[i])
		return;

	tmp = H[i];
	H[i] = H[max];
	H[max] = tmp;

	downHeap(max);
}

void rBuildHeap(int i) {
	if (i > n)
		return;
	rBuildHeap(i * 2);
	rBuildHeap(i * 2 + 1);
	downHeap(i);

	return;
}

void printHeap() {
	for (int i = 1; i <= n; i++) {
		printf(" %d", H[i]);
	}
	printf("\n");
}

int main() {
	int i;

	scanf("%d", &n);

	for (int i = 1; i <= n; i++) {
		scanf("%d", &H[i]);
		getchar();
	}

	rBuildHeap(1);
	printHeap();

	return 0;
}
๋ฐ˜์‘ํ˜•