Cod sursa(job #767244)

Utilizator igsifvevc avb igsi Data 13 iulie 2012 00:37:20
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef unsigned int uint;

FILE *in, *out;
uint v[500001], N;

void quicksort(uint l, uint r)
{
    uint aux, ll, rr, pivot;
    
    if(l < r && r - l < 16)
    {
        for(ll = l; ll < r; ++ll)
            for(rr = ll + 1; rr <= r; ++rr)
                if(v[ll] > v[rr])
                { aux = v[ll]; v[ll] = v[rr]; v[rr] = aux; }
    }
    else if(l < r)
    {
        pivot = l + rand() % (r - l + 1);
        aux = v[r]; v[r] = v[pivot]; v[pivot] = aux;
        pivot = r;
        for(ll = l - 1, rr = r; ll < rr;)
        {
            while(ll < rr && v[++ll] < v[pivot]);
            while(ll < rr && v[pivot] < v[--rr]);
            
            aux = v[ll]; v[ll] = v[rr]; v[rr] = aux;
        }
        aux = v[pivot]; v[pivot] = v[ll]; v[ll] = aux;

        pivot = ll;
        quicksort(l, pivot - 1);
        quicksort(pivot + 1, r);
    }
}

int main()
{
    uint i;

    in = fopen("algsort.in", "r");
    out = fopen("algsort.out", "w");
    srand(time(NULL));
    
    fscanf(in, "%d", &N);
    for(i = 1; i <= N; ++i)
        fscanf(in, "%d", &v[i]);

    quicksort(1, N);

    for(i = 1; i <= N; ++i)
        fprintf(out, "%d ", v[i]);
    fprintf(out, "\n");

    fclose(in);
    fclose(out);
    return 0;
}