Pagini recente » Cod sursa (job #2692231) | Cod sursa (job #1908083) | Cod sursa (job #2285378) | Cod sursa (job #2123750) | Cod sursa (job #1467615)
#include <iostream>
#include <vector>
#include <cstdlib>
#include <fstream>
template <typename T>
void print(T *v, int N) {
for (int i = 0; i < N; i++) {
std::cout << v[i] << (i < N -1 ? ' ' : '\n');
}
}
template <typename T>
void heapify(T *H, const int& N, int i, bool (* const cmp)(const T&, const T&)) {
int smallerSon = i, right, left;
while (1) {
smallerSon = i;
right = 1 + (left = (i << 1));
if (left <= N && cmp(H[left], H[smallerSon])) smallerSon = left;
if (right <= N && cmp(H[right], H[smallerSon])) smallerSon = right;
if (smallerSon != i) {
std::swap(H[smallerSon], H[i]);
i = smallerSon;
} else {
return;
}
}
}
bool my_cmp(const int& first, const int& last) {
return first > last;
}
template <typename T>
void HeapSort(T *vbegin, T *vend, bool (*cmp)(const T&, const T&) = my_cmp) {
T *H = vbegin - 1;
int N = (vend - vbegin);
for (int i = N/2; i >= 1; --i) {
heapify<T>(H, N, i, cmp);
}
while ( N != 1 ){
std::swap(H[1], H[N]);
heapify<T>(H, --N, 1, cmp);
}
}
int main() {
std::ifstream f("algsort.in");
std::ofstream g("algsort.out");
int N, *v;
f >> N;
v = new int[N];
for (int i = 0; i < N; i++) {
f >> v[i];
}
HeapSort<int>(v, v + N);
for (int i = 0; i < N; i++) {
g << v[i] << (i < N -1 ? ' ' : '\n');
}
delete[] v;
return 0;
}