Pagini recente » Cod sursa (job #2948555) | Cod sursa (job #784121) | Cod sursa (job #256741) | Cod sursa (job #1667720) | Cod sursa (job #2257988)
#include <cstdio>
#define swap(a, b) {unsigned aux; aux=a; a=b; b=aux;}
#define min(a, b) (a<b?a:b)
#define max(a, b) (a>b?a:b)
#define MaxN 500005
using namespace std;
unsigned Inf, N, i, j, List[MaxN], Copy;
void Sift(unsigned i);
int main()
{
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
scanf("%d", &N);
for(i=1; i<=N; ++i){
scanf("%d", &List[i]);
Inf=max(Inf, List[i]);}
++Inf;
for(i=N/2; i>=1; --i) Sift(i);
Copy=N;
for(i=1; i<Copy; ++i){
printf("%u ", List[1]);
List[1]=Inf;
Sift(1);
}
printf("%d", List[1]);
return 0;
}
void Sift(unsigned i){
bool k=1;
while(i*2<=N && k){
k=0;
if(i*2==N && List[i*2]<List[i]){
swap(List[i*2], List[i]);
i*=2;
k=1;
}
else if(i*2+1<=N && (List[i*2]<List[i] || List[i*2+1]<List[i])){
unsigned a=(List[i*2]<List[i*2+1]?i*2:i*2+1);
swap(List[i], List[a]);
i=a;
k=1;
}
}
return;
}