Cod sursa(job #2263606)

Utilizator Horia14Horia Banciu Horia14 Data 18 octombrie 2018 21:09:29
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<ctime>
#define MAX_N 500000
#define BUF_SIZE 1 << 18
using namespace std;

int v[MAX_N], n, pos = BUF_SIZE;
char buf[BUF_SIZE];

inline char getChar(FILE* fin) {
    if(pos == BUF_SIZE) {
        fread(buf,1,BUF_SIZE,fin);
        pos = 0;
    }
    return buf[pos++];
}

inline int read(FILE* fin) {
    int res = 0;
    char ch;
    do {
        ch = getChar(fin);
    }while(!isdigit(ch));
    do {
        res = 10*res + ch - '0';
        ch = getChar(fin);
    }while(isdigit(ch));
    return res;
}

void readArray() {
    FILE* fin = fopen("algsort.in","r");
    n = read(fin);
    for(int i = 0; i < n; i++)
        v[i] = read(fin);
    fclose(fin);
    srand(time(NULL));
}

void quickSort(int Begin, int End) {
    int aux, b = Begin, e = End, pivot = v[b + rand()%(e-b+1)];
    while(b <= e) {
        while(v[b] < pivot) b++;
        while(v[e] > pivot) e--;
        if(b <= e) {
            aux = v[b];
            v[b] = v[e];
            v[e] = aux;
            b++;
            e--;
        }
    }
    if(Begin < e) quickSort(Begin,e);
    if(b < End) quickSort(b,End);
}

void printArray() {
    FILE* fout = fopen("algsort.out","w");
    for(int i = 0; i < n; i++)
        fprintf(fout,"%d ",v[i]);
    fprintf(fout,"\n");
    fclose(fout);
}

int main() {
    readArray();
    quickSort(0,n-1);
    printArray();
    return 0;
}