Cod sursa(job #643987)

Utilizator dany123Florea Daniel dany123 Data 4 decembrie 2011 23:38:42
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
//shellsort 4.12.2011
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin ("algsort.in");
ofstream fout ("algsort.out");
int n,v[500001];
//long nr1=0,nr2=0; //*nr bucle
void shellsort_clasic()
{
	
	for (int gap=n/2;gap>0;gap/=2)
		for (int i=gap;i<n;i++)
		{
			int j=i;
			while (j-gap>=0 && v[j]<v[j-gap]) //*nr bucle: ++nr1
			{
				int aux=v[j];v[j]=v[j-gap];v[j-gap]=aux;//intersch
				j=j-gap;
			}
		}
}

void shellsort_serie()
{
	int gaps[16] = { 1391376, 463792, 198768, 86961, 33936,
                     13776, 4592, 1968, 861, 336, 
                     112, 48, 21, 7, 3, 1 };
	for (int k=0;k<16;k++)
		if (gaps[k]<n/2+1)
		{
			int gap=gaps[k];
			for (int i=gap;i<n;i++)
			{
				int j=i;
				while (j-gap>=0 && v[j]<v[j-gap]) //*nr bucle: ++nr1
				{
					int aux=v[j];v[j]=v[j-gap];v[j-gap]=aux;//intersch
					j=j-gap;
				}
			}
		}
}

int main ()
{
	fin>>n; for (int i=0;i<n;i++) fin>>v[i]; //citire
	
	//shellsort_clasic();
	shellsort_serie();
	
	for (int i=0;i<n;i++) fout<<v[i]<<' '; //scriere
	//cout<<"\n Nr bucle: "<<nr1<<' '<<nr2; //testing
	fin.close();
	fout.close();
	return 0;
}