Cod sursa(job #374129)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 15 decembrie 2009 23:43:05
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>

int in[500001];     //
void Sh_modif(int* t,int st,int dr,int k) 
{
	int i,j,h=in[k],v;
	while(k>=0)
    {
		for(i=st+h; i<=dr; i++)
		{
			j=i; v=t[i];
			while(v < t[j-h] && j >= st+h) {t[j]=t[j-h]; j-=h;}
			t[j]=v;
		}
		k--;
		h=in[k];
	}
}
int n,t[500003],a[180000],b[180005],val1,val2,i=0,j,k;
int main()
{freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
	
 scanf("%d",&n);
 
 for(i=0;i<n;i++) scanf("%d",&t[i]);


	for(i=0;a[i-1]<n/3||i==0;i++)				
		a[i]=9*(1<<(2*i))-9*(1<<i)+1; 
	val1=i;

	for(i=0;b[i-1]<n/3||i==0;i++)					
		b[i]=(1<<(2*i))-3*(1<<i)+1; 
	val2=i;


	for(i=0,j=0,k=0;i<val1&&j<val2;k++)			
		if(a[i]<b[j]) {in[k]=a[i]; i++; }
		else {in[k]=b[j]; j++; }
	while(i<val1) 
		{in[k]=a[i]; k++; i++;}
	while(j<val2) 
		{in[k]=b[j]; k++; j++;}
	

	while(in[0]<=0)					
		{for(i=0;i<k;i++) in[i]=in[i+1];k--;}  




	Sh_modif(t,0,n,k);
	for(i=1;i<=n;i++) printf("%d ",t[i]);
	
	return 0;
}