쌓 기 정렬 (최소 쌓 기)
1260 단어 데이터 구조
코드:
#include int h[101]; int n;
/ / 교환 함수 void swap (int x, int y) {int t; t = h [x]; h [x] = h [y]; h [y] = t;}
/ / 아래 조정 함수 void siftdown (int i) {int t, flag = 0; / i 에 아들 이 있 을 때 flag = 0 시 순환 while (i2 < = n & & flag = = 0) {/ / i 노드 의 값 과 왼쪽 아들 의 값 if (h [i] > h [22]) {t = i * 2;} else t = i;
// i
if (i*2+1<=n)
{
// i
if (h[t]>h[i*2+1])
{
t=i*2+1;
}
}
// ,
if (t!=i)
{
swap(t,i);
i=t;
}
else flag=1;
}
}
/ / 최소 함수 void creat () {int i; for (i = n / 2; i > = 1; i –) {siftdown (i);}}
/ / 최대 노드 int deletemax () {int t; / t 는 루트 노드 의 값 (즉 번호 가 1 인 값) t = h [1] 을 잠시 저장 합 니 다.
int main () {int i, num; / 노드 수 scanf ("% d", & num); / 읽 은 num 개 수 를 완전히 이 진 트 리 로 저장 합 니 다 for (i = 1; i < = num; i + +) {scanf ("% d", & h [i]);}
n=num;
// ( : )
creat();
// ,
for (i=1;i<=num;i++)
{
printf("%d ",deletemax());
}
return 0;
}
테스트 결과: 1, 2, 5, 7, 12, 17, 19, 22, 25, 28, 36, 46, 92, 99