Cod sursa(job #658809)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 9 ianuarie 2012 17:05:24
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#define nmax 500000
#define BUF 100010

char buffer[BUF+4];
int poz=BUF-1;
FILE *fin;

void cit(int &n){
   n=0;
   poz++;
   if(poz==BUF){
     poz=0;
     //citesc o noua linie
     fread (buffer,sizeof(char),BUF,fin);
   }
   while(buffer[poz]>='0' && buffer[poz]<='9'){
      n=n*10+(buffer[poz]-'0');
      poz++;
      if(poz==BUF){
       poz=0;
       //citesc o noua linie
       fread (buffer,sizeof(char),BUF,fin);
      }
   }
}

void interclasare(int *v, int li1,int ls1, int li2, int ls2){
     int rez[nmax],a=li1,b=li2,c=0;
     while(a<=ls1 && b<=ls2){
        if(v[a]<v[b]){
           rez[c++]=v[a++];
        }else{
           rez[c++]=v[b++];       
        }
     }
   int i;
   for(i=a;i<=ls1;i++)rez[c++]=v[i];
   for(i=b;i<=ls2;i++)rez[c++]=v[i];
   //copiez rez in v...
   for(i=li1;i<=ls2;i++)
      v[i]=rez[i-li1];
}

void merge(int *v, int li, int ls){
    int k;
    if(ls-li<2){
      if(v[li]>v[ls]){
       k=v[li];
       v[li]=v[ls];
       v[ls]=k;
      }
    }else
    if(li<ls){
       k=(li+ls)/2;
       merge(v,li,k);
       merge(v,k+1,ls);
       interclasare(v,li,k,k+1,ls);
    }
}

int main(){
  int v[nmax],n; 
  fin=fopen("algsort.in","r");
  cit(n);
  int i;
  for(i=0;i<n;i++){
     cit(v[i]);
  }
  fclose(fin);
  merge(v,0,n-1);

  FILE  *fout=fopen("algsort.out","w");

  for(i=0;i<n;i++){
     fprintf(fout,"%d ",v[i]);
  }
 fprintf(fout,"\n");
 fclose(fout);

return 0;
}