Cod sursa(job #1835976)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 27 decembrie 2016 16:49:20
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <vector>


class Heap{
private:
    std::vector<int> heap;
public:
    void push(int value)
    {
        heap.push_back(value);
        for(int v=heap.size()-1;v!=0;v=(v-1)/2)
        {
            if(heap[v] < heap[(v-1)/2])
                std::swap(heap[v],heap[(v-1)/2]);
            else
                break;
        }
    }

    size_t size()
    {
        return heap.size();
    }

    int top()
    {
        return heap[0];
    }

    void pop()
    {
        std::swap(heap[0],heap[ heap.size()-1 ]);
        heap.pop_back();
        int v=0;
        while(true)
        {
            if((2*v+1<(int)heap.size() && heap[2*v+1]<heap[v]) && (2*v+2>=(int)heap.size() || heap[2*v+1]<heap[2*v+2]))
            {
                std::swap(heap[v],heap[2*v+1]);
                v=2*v+1;
                continue;
            }
            if((2*v+2<(int)heap.size() && heap[2*v+2]<heap[v]) && heap[2*v+2]<heap[2*v+1])
            {
                std::swap(heap[v],heap[2*v+2]);
                v=2*v+2;
                continue;
            }
            break;
        }
    }


};
void heapSort(std::vector<int> &v)
{
    Heap H;
    while(v.size())
    {
        H.push(v[ v.size()-1 ]);
        v.pop_back();
    }
    while(H.size())
    {
        v.push_back(H.top());
        H.pop();
    }
}
int main()
{
    std::ifstream in("algsort.in");
    int n;
    std::vector<int> v;
    in>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        in>>x;
        v.push_back(x);
    }
    in.close();
    heapSort(v);
    std::ofstream out("algsort.out");
    for(int i=0;i<n;i++)
        out<<v[i]<<' ';
    out<<'\n';
    out.close();
    return 0;
}