Pagini recente » Cod sursa (job #3245761) | Cod sursa (job #1978194) | Cod sursa (job #297135) | Cod sursa (job #165413) | Cod sursa (job #2356034)
#include <iostream>
#include <vector>
using namespace std;
int compareElements(int a, int b) {
//cntComparisons++;
return a - b;
}
void swapElements(int &a, int &b) {
//cntExchanges++;
swap(a, b);
}
int leftSon(int k) {
return k * 2;
}
int rightSon(int k) {
return k * 2 + 1;
}
int parent(int k) {
return k / 2;
}
void sink(int heap[], int k, int n) {
while (leftSon(k) <= n) {
int j = (leftSon(k) == n || compareElements(heap[leftSon(k)], heap[rightSon(k)]) > 0) ? leftSon(k) : rightSon(k);
if (compareElements(heap[k], heap[j]) >= 0)
break;
swapElements(heap[k], heap[j]);
k = j;
}
}
void heapify(int heap[], int n) {
for (int k = parent(n); k; k--) {
sink(heap, k, n);
}
}
void heapsort(int heap[], int n) {
heapify(heap, heap[0]);
while (n) {
swapElements(heap[1], heap[n]);
n--;
sink(heap, 1, n);
}
}
void runHeapsort(vector<int> &arr) {
int heap[arr.size()+1]; heap[0] = 0;
for (int i = 0; i < (int)arr.size(); ++i)
heap[++heap[0]] = arr[i];
heapsort(heap, heap[0]);
for (int i = 1; i <= heap[0]; ++i)
arr[i-1] = heap[i];
}
int main() {
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
ios_base::sync_with_stdio(false);
int N; cin >> N;
vector<int> arr;
for (int i = 0; i < N; ++i) {
int x; cin >> x;
arr.push_back(x);
}
runHeapsort(arr);
for (auto &it: arr)
cout << it << ' ';
return 0;
}