Cod sursa(job #1229412)

Utilizator thinkphpAdrian Statescu thinkphp Data 17 septembrie 2014 09:31:02
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.62 kb
#include <stdio.h>
#define MAX 500010
#define FIN "algsort.in"
#define FOUT "algsort.out"
 
int vec[ MAX ],
    n;

void read();
void sort();
int divimp(int,int);
void mergesort(int,int,int);
void write();
 
 
int main() {
  
    read();
    sort();
    write();
 
    return 0;
}
 
void read() {
 
     int i;
 
     freopen(FIN, "r", stdin);
 
     scanf("%d", &n);
 
     for(i = 0; i < n; i++) {
 
         scanf("%d", &vec[ i ]);
     }
 
     fclose( stdin ); 
};
 
void sort() {
 
     divimp(0, n-1);  
};

void mergesort(li, middle, ls) {

     int i, j, k, c[ MAX ], p;
 
     k = 0;

     i = li;

     j = middle + 1;

     while(i<= middle && j <= ls) {

          if(vec[i] < vec[j]) {

             c[ k++ ] = vec[ i++ ];  

          } else {

             c[ k++ ] = vec[ j++ ];  
          }
     }

     if( i<= middle) {
 
         for( p = i; p <= middle; p++) {

               c[ k++ ] = vec[ p ];
         }  

     } else {

         for( p = j; p <= ls; p++) {

               c[ k++ ] = vec[ p ];
         }  
     }

     k = 0;

     for(i = li; i <= ls; i++) {

         vec[ i ] = c[ k++ ];
     }
};

int divimp(int li, int ls) {

     int middle;

     if(li == ls) return vec[ li ];

     else {

          middle = (li+ls)/2;

          divimp(li, middle);

          divimp(middle + 1, ls);

          mergesort(li, middle, ls);
     }
}
 
void write() {
 
     int i;
 
     freopen(FOUT, "w", stdout);
 
     for(i = 0; i < n; i++) {
 
         printf("%d ", vec[ i ]);
     }
 
     fclose(stdout);
};