Cod sursa(job #2540427)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 7 februarie 2020 10:00:09
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#include <time.h>
using namespace std;
FILE * fin=fopen("algsort.in", "r");
FILE * fout=fopen("algsort.out", "w");
int i,n,v[500010];
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 dst=0, ddr=-1;
    int x=st+rand()%(dr-st+1);
    swap(v[x],v[st]);
    while (st<dr) {
        if (v[st]>v[dr]) {
            swap(v[st],v[dr]);
            int aux=dst;
            dst=-ddr;
            ddr=-aux;
        }
        st+=dst;
        dr+=ddr;
    }
    return st;
}
void sorteaza(int st,int dr) {
    if (st<dr) {
        int p=poz(st,dr);
        sorteaza(st,p-1);
        sorteaza(p+1,dr);
    }
}
int main() {
    fread(buff,1,100000,fin);
    n=numar();
    for (i=1;i<=n;i++)
        v[i]=numar();
    for (i=n;i;i--)
        swap(v[rand()*1LL*rand()%i+1],v[i]);
    srand(time(0));
    sorteaza(1,n);
    for (i=1;i<=n;i++)
        fprintf(fout,"%d ",v[i]);
    return 0;
}