Cod sursa(job #767201)

Utilizator igsifvevc avb igsi Data 12 iulie 2012 22:52:13
Problema Sortare prin comparare Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 1.28 kb
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef unsigned int uint;

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

void quicksort(int l, int r)
{
    int aux, ll, rr, il, ir, pivot;
    
    if(r - l < 10)
    {
        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)
    {
        ll = l;
        rr = r;
        il = 0; 
        ir = -1;
    
        pivot = l + rand() % (r - l + 1);
        aux = v[pivot]; v[pivot] = v[ll]; v[ll] = aux;
        while(ll < rr)
        {
            if(v[ll] > v[rr])
            {
                aux = v[ll]; v[ll] = v[rr]; v[rr] = aux;
                aux = -il; il = -ir; ir = aux;
            }
            ll += il;
            rr += ir;
        }

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

int main()
{
    int i;

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

    quicksort(0, N-1);

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

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