되는대로 살자

[Algorithm] heap sort 본문

2009~2014/C/C++

[Algorithm] heap sort

malu 2012. 1. 13. 22:00
#include <stdio.h>
#include <stdlib.h>

#define SIZE 100

int main()
{
int heap[SIZE], i,j,t,n,s=3,chk;
scanf("%d",&n);
// 가장 말단에 원소 추가
for(i=1;i<=n;i++) {
scanf("%d",&heap[i]);
//원소 말단에서 적합한 위치에 배치 
j=i;
while(j!=1 && heap[j/2] < heap[j]) {
t=heap[j/2];
heap[j/2]=heap[j];
heap[j]=t;
j/=2;
}
}
for(i=1;i<=n;i++) 
printf("%d ",heap[i]);
//힙에서 원소 꺼내기 
for(i=0;i<s;i++) {
// printf("%d ",heap[1]);
heap[1]=heap[n-i];
j=1;
while(j*2<n-i) { // 마지막검사 
chk=0;
if(j*2+1<n-i) { 
chk=1;
if(heap[j*2+1]>heap[j*2]) {
if(heap[j*2+1]>heap[j]) {
t=heap[j*2+1];
heap[j*2+1]=heap[j];
heap[j]=t;
j=j*2+1;
}
else 
break;
}
else if(heap[j*2]>heap[j]) {
t=heap[j*2];
heap[j*2]=heap[j];
heap[j]=t;
j*=2;
}
else 
break;
}
else if(heap[j*2]>heap[j])  {
chk=1;
t=heap[j];
heap[j]=heap[j*2];
heap[j*2]=t;
j*=2;
}
if(!chk)
break;
}
}
printf("\n");
for(i=1;i<n-s+1;i++) 
printf("%d ",heap[i]);
}