Cod sursa(job #1490626)

Utilizator tudorcomanTudor Coman tudorcoman Data 23 septembrie 2015 21:32:16
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void quickswap(int &a, int &b) {
    if(a != b) {
        a = a xor b;
        b = a xor b;
        a = a xor b;
    }
}

const int MAX_N = 500000;
int v[MAX_N];

void quicksort(int *begin, int *end) {
    int n = end - begin;
    if(n > 1) {
        int pivot = rand() % n;
        quickswap(begin[pivot], begin[n - 1]);
        pivot = begin[n - 1];
        int i = 0;
        for(register int j = 0; j < n - 1; ++ j)
            if(begin[j] < begin[n - 1])
                quickswap(begin[i], begin[j]), ++ i;

        int i2 = i;
        for(register int j = i2; j < n; ++ j) {
            if(begin[j] == begin[n - 1])
                quickswap(begin[i2], begin[j]), ++ i2;
        }

        quicksort(begin, begin + i);
        quicksort(begin + i2, end);
    }
}

int main() {
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);
    int N;
    scanf("%d", &N);

    for(register int i = 0; i < N; ++ i)
       scanf("%d", &v[i]);

    quicksort(v, v + N);

    for(register int i = 0; i < N; ++ i)
        printf("%d ", v[i]);
    printf("\n");
    return 0;
}