Cod sursa(job #334039)

Utilizator nimeniaPaul Grigoras nimenia Data 25 iulie 2009 01:35:00
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include <fstream.h>

ifstream f("algsort.in");
ofstream g("algsort.out");

const int Nmax=500001;

void readV(int &n,int v[Nmax]){
        f>>n;
        for(int i=0;i<n;i++) f>>v[i];
     }

void output(int n,int v[Nmax]){
        for(int i=0;i<n;i++) g<<v[i]<<" ";
        g<<'\n';
     }
void output(int n){
        g<<n<<'\n';
     }

void sort(int n,int v[Nmax]){
        int i,j,t;
        readV(n,v);
        for(i=0;i<n-1;i++)
            for(j=i+1;j<n;j++)
                if (v[i]>v[j]) {t=v[i],v[i]=v[j],v[j]=t;}
           
     }
     
void InsertSort(int &n,int v[Nmax]){
        f>>n;
              
        int N=1,j,num;
            
        for(int i=0;i<n;i++){
            f>>num;
            j=N-1;
            while (j>0 && v[j-1]>num) {v[j]=v[j-1];j--;}
            v[j]=num;
            N++;
        }
    }
void SelSort(int &n,int v[Nmax]){
        //int Nmax=50001;
        int a[Nmax],m[Nmax],p_min,p_minB=0,nA=0,i,j;

        readV(n,v);

		for(i=0;i<n+1;i++) m[i]=0;
		
        for(i=0;i<n;i++){
            p_min=p_minB;
			while (m[p_min]==-1) p_min++;
			p_minB=p_min;
			
			for(j=p_min+1;j<n;j++)
				if (m[j]!=-1 && v[j]<v[p_min]) p_min=j;

			a[nA++]=v[p_min];m[p_min]=-1;
	     }
		
		for(i=0;i<n;i++) v[i]=a[i];
	

     }

void Merge(int v[Nmax],int init,int fin){
               int a[fin-init+1],n_adaugat=0;
               int div=(init+fin)/2;
               int cs=init,cd=div+1;
               while (cs<=div && cd<=fin){
                       if (v[cs]<v[cd]) a[n_adaugat]=v[cs++];
                       else a[n_adaugat]=v[cd++];
                       n_adaugat++; 
                    //   output(n_adaugat,a);                       
                     }
            //   output(n_adaugat,a);
               while (cs<=div) a[n_adaugat++]=v[cs++];
               while (cd<=fin) a[n_adaugat++]=v[cd++];
               for(int i=0;i<n_adaugat;i++)
                       v[i+init]=a[i];
     }
     
void MergeSort(int v[Nmax],int init,int fin){
               if (init==fin)    return;
               else { MergeSort(v,init,(fin+init)/2);
                      MergeSort(v,(fin+init)/2+1,fin);
                      Merge(v,init,fin);
                      }
     }

int main(){
    int n,v[Nmax],i;
    //sort(n,v);
    //InsertSort(n,v);
    //SelSort(n,v);
    //readV(n,v);
    //Merge(v,3,6);
    readV(n,v);
    MergeSort(v,0,n-1);
    for(i=0;i<n;i++) g<<v[i]<<" ";

    return 0;
}