Cod sursa(job #2273878)

Utilizator mihaicivMihai Vlad mihaiciv Data 1 noiembrie 2018 09:04:26
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void quickSort(int, int, int *);
int getMiddle(int, int, int, int*);

int main() {

    FILE *f, *g;

    f = freopen("algsort.in", "r", stdin);
    g = freopen("algsort.out", "w", stdout);

    int n;
    scanf("%d", &n);
    int *v = malloc(n * sizeof(int) );
    int i;
    for (i = 0; i < n; ++i) {
        scanf("%d", &v[i]);
    }

    srand(time(NULL));
    quickSort(0, n - 1, v);

    for (i = 0; i < n; ++i) {
        printf("%d ", v[i]);
    }

    return 0;
}

void quickSort(int left, int right, int *v) {

    int i = left;
    int j = right;
    int rand1 = rand() % (right - left + 1) + left;
    int rand2 = rand() % (right - left + 1) + left;
    int rand3 = rand() % (right - left + 1) + left;
    int pivot = getMiddle(rand1, rand2, rand3, v);
    while ( i <= j ) {
        while (v[i] < pivot) {
            i ++;
        }
        while (v[j] > pivot) {
            j --;
        }
        if (i <= j) {
            int aux = v[i];
            v[i] = v[j];
            v[j] = aux;
            i ++;
            j --;
        }
    }
    if (i < right) quickSort(i, right, v);
    if (j > left) quickSort(left, j, v);

}

int getMiddle(int x, int y, int z, int *v) {

    if (v[x] <= v[y] && v[x] <= v[z]) {
        return ( (v[y] < v[z]) ? v[y]:v[z] );
    }
    if (v[y] <= v[x] && v[y] <= v[z]) {
        return ( (v[x] < v[z]) ? v[x]:v[z]);
    }
    if (v[z] <= v[x] && v[z] <= v[y]) {
        return ( (v[x] < v[y]) ? v[x]:v[y]  );
    }

}