Pagini recente » Cod sursa (job #2566768) | Cod sursa (job #1948440) | Cod sursa (job #1411211) | Cod sursa (job #1002671) | Cod sursa (job #2198719)
#include <fstream>
#include <vector>
using namespace std;
typedef unsigned long int ulong;
ulong n;
template<typename T>
class heap{
public:
heap() {}
inline T getMin() const { return heapA[0];}
inline void push(T t) { heapA.push_back(t); int i = heapA.size()-1; while(i&&heapA[parent(i)] > heapA[i]) swap(heapA[parent(i)], heapA[i]), i = parent(i); }
inline ulong left(ulong index) const { return 2*index+1; }
inline ulong right(ulong index) const { return 2*index+2; }
inline ulong parent(ulong index) const { return (index-1)/2; }
void minHeapify(ulong index){ int mn = index;
if(left(index) < heapA.size() && heapA[left (index)]<heapA[mn]) mn=left (index);
if(right(index) < heapA.size() && heapA[right(index)]<heapA[mn]) mn=right(index);
if(mn!=index) swap(heapA[mn], heapA[index]), minHeapify(mn);}
void popMin() { heapA[0] = heapA[heapA.size()-1]; heapA.pop_back(); minHeapify(0); }
~heap() {}
private:
vector<T> heapA;
};
int main()
{
ifstream f("algsort.in");
ofstream g("algsort.out");
heap<ulong> h;
f >> n;
for(ulong i = 0; i < n; i++)
{
ulong u;
f >> u;
h.push(u);
}
for(ulong i = 0; i < n; i++)
{
g << h.getMin() << ' ';
h.popMin();
}
return 0;
}