Cod sursa(job #2341631)

Utilizator axelteoTeodor Dutu axelteo Data 12 februarie 2019 02:54:28
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#define NMAX 500000

using namespace std;

FILE *pInFile, *pOutFile;
int v[NMAX], pos = NMAX - 1, n;
char buff[NMAX];

void readInt(int &x) {
    while (buff[pos] < '0' || buff[pos] > '9') {
        if (++pos == NMAX) {
            fread(buff, 1, NMAX, pInFile);
            pos = 0;
        }
    }

    while (buff[pos] >= '0' && buff[pos] <= '9') {
        x = x * 10 + buff[pos] - '0';
        if (++pos == NMAX) {
            fread(buff, 1, NMAX, pInFile);
            pos = 0;
        }
    }
}

int partition(int left, int right) {
    pos = random() % (right - left + 1) + left;
    int pivot = v[pos], i, j;

    for (i = left, j = right;;) {
        for (; v[i] < pivot; ++i);
        for (; v[j] > pivot; --j);

        if (i < j) {
            swap(v[i++], v[j--]);
        } else {
            return j;
        }
    }
}

void quickSort(int left, int right) {
    if (left >= right) {
        return;
    }

    int mid = partition(left, right);
    quickSort(left, mid);
    quickSort(mid + 1, right);
}

int main() {
    pInFile = fopen("algsort.in", "r");
    pOutFile = fopen("algsort.out", "w");

    readInt(n);

    for (int i = 0; i < n; ++i) {
        readInt(v[i]);
    }

    quickSort(0, n - 1);

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

    fclose(pInFile);
    fclose(pOutFile);
    return 0;
}