Pagini recente » Cod sursa (job #3228600) | Cod sursa (job #2073723) | Cod sursa (job #1046358) | Cod sursa (job #325796) | Cod sursa (job #1978299)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
#define pb push_back
#define ll long long
const int NMax = 5e5 + 5;
const int inf = 1e9 + 5;
int N;
void sift(int*,int,int);
void buildHeap(int*,int);
void heapsort(int*,int);
int main() {
in>>N;
int *v = new int[N+1];
for (int i=1;i <= N;++i) {
in>>v[i];
}
heapsort(v,N);
for (int i=1;i <= N;++i) {
out<<v[i]<<' ';
}
in.close();out.close();
return 0;
}
void heapsort(int* heap,int N) {
buildHeap(heap,N);
for (int i=N;i > 1;--i) {
swap(heap[1],heap[i]);
sift(heap,1,i-1);
}
}
void buildHeap(int* heap,int N) {
for (int i=N/2;i > 0;--i) {
sift(heap,i,N);
}
}
void sift(int* heap,int node,int N) {
int son = 0;
do {
int fs = 2*node,
ss = 2*node + 1;
if (fs <= N) {
son = fs;
if (ss <= N && heap[ss] > heap[son]) {
son = ss;
}
}
if (son && heap[son] > heap[node]) {
swap(heap[son],heap[node]);
node = son;
}
else {
son = 0;
}
}
while (son);
}