Cod sursa(job #1735271)

Utilizator antanaAntonia Boca antana Data 29 iulie 2016 13:43:11
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include<ctype.h>
#include<stdlib.h>
#include<time.h>
#define BUF_SIZE 4096
#define MAXN 500000

int v[MAXN+1], pos=BUF_SIZE, n;
char buf[BUF_SIZE];

inline char getChar(FILE *f)
{
    if(pos==BUF_SIZE) pos=0, fread(buf, 1, BUF_SIZE, f);
    return buf[pos++];
}
inline int getInt(FILE *f)
{
    char c;
    int nr=0;
    while(!isdigit(c)) c=getChar(f);
    while(isdigit(c)) nr=nr*10+c-'0', c=getChar(f);
    return nr;
}

inline void swap1(int a, int b)
{
    int aux=v[a];
    v[a]=v[b];
    v[b]=aux;
}
inline int pivotare(int p, int q)
{
    int i, x=v[q];
    i=p-1;
    for(int j=p; j<q; ++j)
        if(v[j] < x)
            i++, swap1(i, j);
    swap1(i+1, q);
    return i+1;
}
inline int randomp(int p, int q)
{
    int l=q-p+1, r;
    r=rand() % l;
    swap1(p+r, q);
    return pivotare(p, q);
}
void QuickSort(int p, int q)
{
    int r;
    if(p < q)
    {
        r=randomp(p, q);
        QuickSort(p, r-1);
        QuickSort(r+1, q);
    }
}
int main()
{
    srand(time(0));

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

    n=getInt(fin);
    for(int i=1;i<=n;++i)
        v[i]=getInt(fin);

    QuickSort(1, n);

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

    fclose(fin);
    fclose(fout);

    return 0;
}