Cod sursa(job #1239362)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 8 octombrie 2014 22:47:33
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.37 kb
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define Nmax 500005

int v[Nmax];
int n;

int get_pivot(int inf, int sup){
    if (sup - inf <= 2)
        return (inf + sup) / 2;
    int a = rand() % (sup - inf + 1) + inf; 
    int b = rand() % (sup - inf + 1) + inf; 
    int c = rand() % (sup - inf + 1) + inf;
    if (v[a] >= v[b] && v[b] >= v[c])
        return b;
    else if (v[b] >= v[a] && v[a] >= v[c])
        return a;
    return c;
}

void swap(int *a, int *b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void print(){
    int i;
    for (i = 1; i <= n; ++i)
        printf("%d ", v[i]);
    printf("\n");
}

void quick_sort(int inf, int sup){
    if (sup - inf < 2){
        if (v[sup] < v[inf])
            swap(&v[sup], &v[inf]);
        return;
    }
    int at = (inf + sup) / 2;
    int p = v[at];
    int i = inf;
    int j = sup;
    while (i <= j){
        while (v[i] < p) ++i;
        while (v[j] > p) --j;
        if (i <= j){
            swap(&v[i], &v[j]);
            ++i;
            --j;
        }
    }
    quick_sort(inf, i - 1);
    quick_sort(i, sup);
}

int main(){
    int i;
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);
    srand( time(NULL) );
    
    scanf("%d", &n);
    for (i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
    quick_sort(1, n);
    print();
    
    fclose(stdin);
    return 0;
}