Cod sursa(job #1239380)

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

#define Nmax 500005

int v[Nmax];
int n;

int get_pivot(int l, int r){
    if (r - l <= 2)
        return (l + r) / 2;

    int a = (rand() % (r - l + 1)) + l;
    int b = (rand() % (r - l + 1)) + l; 
    int c = (rand() % (r - l + 1)) + l;

    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 l, int r){
    if (r - l < 1)
        return;
    if (r - l == 1){
        if (v[r] < v[l])
            swap(&v[r], &v[l]);
        return;
    }

    int at = get_pivot(l, r);
    /* int at = (r + l) / 2; */
    int p = v[at];
    int i = l;
    int j = r;

    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(l, i - 1);
    quick_sort(i, r);
}

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;
}