ν‹°μŠ€ν† λ¦¬ λ·°

[제자리 νž™ μ •λ ¬]

- νž™ 생성 방식은 μ‚½μž…μ‹, 상ν–₯식 쀑 μ•„λ¬΄κ±°λ‚˜ μ‚¬μš©

- μˆœμ°¨νž™μ„ 톡해 κ΅¬ν˜„ν•œλ‹€λ©΄ μΆ”κ°€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  제자리 νž™ 정렬이 κ°€λŠ₯함

- μœ μΌν‚€

- 쀑볡킀

- 쀑볡 ν‚€λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μž‘μ„±λœ μ•Œκ³ λ¦¬μ¦˜μ€ 유일 ν‚€ ν™˜κ²½μ—μ„œλ„ μ •ν™•νžˆ μž‘λ™ν•œλ‹€. ν•˜μ§€λ§Œ 유일 ν‚€λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μž‘μ„±λœ μ•Œκ³ λ¦¬μ¦˜μ€ 쀑볡 ν‚€ ν™˜κ²½μ—μ„œλ„ μ •ν™•νžˆ μž‘λ™ν•œλ‹€λŠ” 보μž₯은 μ—†μŒ >> μœ μΌν‚€ μ•Œκ³ λ¦¬μ¦˜μ— = (λ“±ν˜Έ) 경우λ₯Ό λΉΌμ§€μ•Šμ•˜λ‹€λ©΄ 쀑볡킀 ν™˜κ²½μ—μ„œλ„ μž‘λ™ν•  것이라고 κ΅μˆ˜λ‹˜μ΄ κ°•μ˜ 쀑 μ–ΈκΈ‰ν•˜μ‹¬

 

μ•„λž˜ μ½”λ“œλŠ” 상ν–₯μ‹μœΌλ‘œ νž™μ„ μƒμ„±ν•˜κ³  μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ 제자리 νž™ 정렬을 ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

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

int H[99];// νž™
int n;// ν‚€ 개수(νž™μ˜ 크기)
int s;// νž™μ˜ μ›λž˜ 크기 μ €μž₯ν•  λ³€μˆ˜

void downHeap(int i) {
	int left = i * 2;//μ™Όμͺ½ μžμ‹
	int right = i * 2 + 1;//였λ₯Έμͺ½ μžμ‹
	int big, tmp;
	if (n < left && n < right)
		return;

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

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

	tmp = H[i];
	H[i] = H[big];
	H[big] = tmp;

	downHeap(big);
}

void rBuildHeap(int i) { // 상ν–₯식 νž™ 생성 ν•¨μˆ˜
	if (i > n)
		return;
	rBuildHeap(i * 2);
	rBuildHeap(i * 2 + 1);
	downHeap(i);

	return;
}

void inPlaceHeapSort() { // 제자리 νž™ μ •λ ¬ ν•¨μˆ˜
	int tmp;
	s = n;

	for (int i = n; i >= 2; i--) {
		tmp = H[1];
		H[1] = H[i];
		H[i] = tmp;
		n--;

		downHeap(1);
	}
}

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


int main() {
	
	scanf("%d", &n);

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

	rBuildHeap(1);

	inPlaceHeapSort();
	printArray();
	
	return 0;
}
λ°˜μ‘ν˜•