Pagini recente » Cod sursa (job #106467) | Cod sursa (job #2808424) | Cod sursa (job #122995) | Cod sursa (job #1779080) | Cod sursa (job #2775744)
#include <fstream>
using namespace std;
#define parent(i) ((i - 1) >> 1)
#define left(i) ((i << 1) + 1)
#define right(i) ((i << 1) + 2)
void siftDown(int *v, size_t n, size_t idx) {
size_t l, r, biggest;
while (true) {
l = left(idx);
r = right(idx);
biggest = idx;
if (l < n && v[biggest] < v[l])
biggest = l;
if (r < n && v[biggest] < v[r])
biggest = r;
if (biggest == idx)
break;
swap(v[biggest], v[idx]);
idx = biggest;
}
}
void moveFirstBack(int *v, int n) {
swap(v[0], v[n - 1]);
n--;
siftDown(v, n, 0);
}
void heapsort(int *v, int n) {
int i;
for (i = parent(n - 1); i >= 0; i--)
siftDown(v, n, i);
while (n > 0) {
moveFirstBack(v, n);
n--;
}
}
int main(void) {
ifstream in("algsort.in");
ofstream out("algsort.out");
int n, i;
in >> n;
int v[n];
for (i = 0; i < n; i++)
in >> v[i];
heapsort(v, n);
for (i = 0; i < n; i++)
out << v[i] << ' ';
in.close();
out.close();
return 0;
}