Cod sursa(job #893630)

Utilizator CS-meStanca Marian Ciprian CS-me Data 26 februarie 2013 16:55:24
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define DIM 500010
FILE *fin=fopen("algsort.in","r");
FILE *fout=fopen("algsort.out","w");
int v[DIM], n, a[DIM];

int poz(int p, int u){
int i,j,ii,jj,aux,x;

    i=p; j=u;
    ii = 0;
    jj = -1;

    x = p + rand()%(u-p+1);
    aux = v[p];
    v[p]=v[x];
    v[x]=aux;

    while(i<j){
        if(v[i]>v[j]){
            aux = v[i];
            v[i] = v[j];
            v[j] = aux;

            aux = ii;
            ii = -jj;
            jj = -aux;
        }
        i+=ii;
        j+=jj;
    }
return i;
}

void qsort(int p , int u){
int m;

    if(p<u){
        m = poz(p,u);

        qsort(p,m-1);
        qsort(m+1,u);
    }
}

void interclasare(int p, int u, int m){ // merge_sort
int nr = p-1;
int i,j;
    for(i = p, j = m+1 ; i<=m && j<=u; ){
        if(v[i]<v[j]){
            a[++nr]=v[i++];
        }
        else{
            a[++nr]=v[j++];
        }
    }

    for(; i<=m; i++){
        a[++nr]=v[i];
    }

    for(; j<=u; j++){
        a[++nr]=v[j];
    }


    for(i = p; i<=u; i++){
        v[i]=a[i];
    }

}

void merge_sort(int p , int u ){
    if(u-p>=1){
        int m = (p+u)/2;

        merge_sort(p,m);
        merge_sort(m+1,u);

        interclasare(p,u,m);
    }
}

int main(){

    srand( time(0) );

    fscanf(fin,"%d",&n);
    for(int i = 1; i <= n; i++){
        fscanf(fin,"%d",&v[i]);
    }


    qsort(1,n);

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


return 0;
}