Cod sursa(job #2540428)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 7 februarie 2020 10:00:53
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
#define cin fin
#define cout fout

using namespace std;

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

int n;
int v[500005];

char buff[100000];
int pp;

int numar(){
    int val=0;

    while(!(buff[pp]>='0' && buff[pp]<='9')){
        pp++;
        if(pp==100000){
            fread(buff,1,100000,fin);
            pp=0;
        }
    }

    while(buff[pp]>='0' && buff[pp]<='9'){
        val=val*10+buff[pp]-'0';

        pp++;
        if(pp==100000){
            fread(buff,1,100000,fin);
            pp=0;
        }
    }

    return val;
}

int poz (int st, int dr){
    int j, x;
    x = st + rand ()%(dr - st + 1);
    swap (v[x], v[st]);
    j = 0;
    while (st < dr){
        if (v[st] > v[dr]){
            swap (v[st], v[dr]);
            j = 1 - j;
        }
        st += j;
        dr -= 1 - j;
    }
    return st;
}

void cuicsort (int st, int dr){
    if (st < dr){
        int p = poz (st, dr);
        cuicsort (st, p - 1);
        cuicsort (p + 1, dr);
    }
}

int main(){
    n = numar();
    for (int i=1; i<=n; i++){
        v[i] = numar();
    }
    for (int i=n; i ;i--)
        swap(v[rand()*1LL*rand()%i+1], v[i]);
    srand (time(0));
    cuicsort (1, n);
    for (int i=1; i<=n; i++){
        fprintf (fout, "%d ", v[i]);
    }
    return 0;
}