Pagini recente » Cod sursa (job #3291294) | Cod sursa (job #3291498)
#include<bits/stdc++.h>
int calculate_minrun(int size) {
int r = 0;
while (size >= 64) {
r |= size & 1;
size >>= 1;
}
return size + r;
}
void merge(std::vector<int> &v,int l,int mid,int r)
{
std::vector<int>aux;
int i=l,j=mid+1;
while( i<=mid and j<=r )
{
if( v[i] < v[j] )
{
aux.push_back( v[i] );
i++;
}
else
{
aux.push_back( v[j] );
j++;
}
}
while( i<=mid )
{
aux.push_back( v[i] );
i++;
}
while( j<=r )
{
aux.push_back( v[j] );
j++;
}
for(int i=l;i<=r;i++)
{
v[i]=aux[i-l];
}
}
void insertion_sort(std::vector<int> &v,int l,int r)
{
for(int i=l+1;i<=r;i++)
{
int aux = v[i];
int j =i-1;
while( j>=l and v[j]>aux )
{
v[j+1]=v[j];
j--;
}
v[j+1] = aux;
}
}
void timsort(std::vector<int>& v)
{
int size = v.size();
int minrun = calculate_minrun(size);
for(int i=0; i<size; i+=minrun)
insertion_sort(v,i,i+std::min(size-1,i+minrun-1) );
for(int bucket =minrun; bucket<size; bucket *=2 )
{
for(int i=0;i<size;i+=2*bucket)
{
int mid = std::min(size-1,i+bucket-1);
int r = std::min(size-1,i+2*bucket-1);
merge(v,i,mid,r);
}
}
}
int main()
{
int n;
std::vector<int> a;
std::ifstream fin("algsort.in");
std::ofstream fout("algsort.out");
fin >> n;
for(int i=1;i<=n;i++)
{
int x;
fin >> x;
a.push_back(x);
}
timsort(a);
for(auto x:a)
fout << x << " ";
return 0;
}