Cod sursa(job #1071746)

Utilizator AndreiOprisanFMI - Oprisan Andrei Daniel AndreiOprisan Data 3 ianuarie 2014 14:15:59
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<vector>
#include<fstream>
#include<stdio.h>

#define maxn 500005

using namespace std;

FILE*f=fopen("algsort.in","r");
FILE*g=fopen("algsort.out","w");

int smaller[maxn],bigger[maxn];

void qsort ( int a[] , int st , int dr ){
    if ( st >= dr ) return ;
    
    smaller[0] = bigger[0] = 0;
    int pozPivot = st + rand() % (dr-st+1),same = 1;
    for ( int i = st ; i <= dr ; ++i ){
        if ( a[i] <= a[pozPivot] ){
            smaller[++smaller[0]] = a[i];
            if ( a[i] != a[pozPivot] )  same = 0;
        }
        else{
            bigger[++bigger[0]] = a[i];
        }
    }
    if ( same ) return ;
    
    int p = st;
    for ( int i = 1 ; i <= smaller[0] ; ++i ){
        a[p++] = smaller[i];
    }
    for ( int i = 1 ; i <= bigger[0] ; ++i ){
        a[p++] = bigger[i];
    }
    
    int sz = smaller[0];
    qsort(a,st,st+sz-1);
    qsort(a,st+sz,dr);
}

int a[maxn];
int main () {
    
    srand(time(NULL));
    int n;
    fscanf(f,"%d",&n);
    for ( int i = 1 ; i <= n ; ++i ){
        fscanf(f,"%d",&a[i]);
    }
    
    qsort(a,1,n);
    
    for ( int i = 1 ; i <= n ; ++i ){
        fprintf(g,"%d ",a[i]);
    }
    fprintf(g,"\n");
    
    return 0;
}