Pagini recente » Cod sursa (job #220752) | Cod sursa (job #44707) | Cod sursa (job #686539) | Cod sursa (job #1365015) | Cod sursa (job #978547)
Cod sursa(job #978547)
#include <vector>
#include <algorithm>
#include <stack>
#include <iterator>
#include <fstream>
#include <iostream>
using namespace std;
template<typename PileType>
bool pile_less(const PileType& x, const PileType& y)
{
return x.top() < y.top();
}
// reverse less predicate to turn max-heap into min-heap
template<typename PileType>
bool pile_more(const PileType& x, const PileType& y)
{
return pile_less(y, x);
}
template<typename Iterator>
void patience_sort(Iterator begin, Iterator end)
{
typedef typename std::iterator_traits<Iterator>::value_type DataType;
typedef std::stack<DataType> PileType;
std::vector<PileType> piles;
for (Iterator it = begin; it != end; it++)
{
PileType new_pile;
new_pile.push(*it);
typename std::vector<PileType>::iterator insert_it =
std::lower_bound(piles.begin(), piles.end(), new_pile,
pile_less<PileType>);
if (insert_it == piles.end())
piles.push_back(new_pile);
else
insert_it->push(*it);
}
// sorted array already satisfies heap property for min-heap
for (Iterator it = begin; it != end; it++)
{
std::pop_heap(piles.begin(), piles.end(), pile_more<PileType>);
*it = piles.back().top();
piles.back().pop();
if (piles.back().empty())
piles.pop_back();
else
std::push_heap(piles.begin(), piles.end(), pile_more<PileType>);
}
}
int main()
{
ifstream f("algsort.in");
ofstream g("algsort.out");
int n;
vector<int> v;
f >> n;
for ( int i = 0, a; i < n; i++ )
f >> a,
v.push_back(a);
patience_sort(v.begin(),v.end());
for ( int i = 0; i < n; i++ )
g<<v[i]<<" ";
}