Cod sursa(job #373932)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 15 decembrie 2009 14:57:40
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>

int in[100];     //Vector ce retine interclasarea expresiilor

void Sh_modif(int* t,int st,int dr,int k) //Sortare cu micsorarea incrementului
{
	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[500004],b[500004],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++)					//Calcularea valorilor primei expresii
		a[i]=9*(1<<(2*i))-9*(1<<i)+1; 
	val1=i;

	for(i=0;b[i-1]<n/3||i==0;i++)					//Calcularea valorilor celei de-a doua expresii
		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;
}