Cod sursa(job #1872029)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 7 februarie 2017 21:28:25
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>

using namespace std;

int a[500005], n;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

void read()
{
    fin >> n;
    for(int i = 0; i < n; i++)
        fin >> a[i];
}

int qpart(int l, int r)
{
    int i, j, x;
    // Pre: l < r, frame: only a[l..r) changes, by a permutation
    x = a[l];
    i = l + 1;
    j = r;
    // inv: 0 < i <= j <= r && a[l..i - 1) < x <= a[j..r)
    // a[l..i - 1) ++ [x] ++ a[i..r) is a permutation of the initial array
    while(i != j)
    {
        while(i != j && (a[i] < x))
        {
            a[i - 1] = a[i];
            i++;
        }
        while(i != j && (a[j - 1] >= x))
            j--;
        if(i != j) // a[j - 1] < x <= a[i]
        {
            a[i - 1] = a[j - 1];
            a[j - 1] = a[i];
            i++;
            j--;
        }
    }
    a[i - 1] = x;
    return (i - 1);
}

void quicksort(int l, int r)
{
    int i;
    // Pre: l <= r && n > 0
    if(r - l > 1)
    {
        i = qpart(l, r); //a[l..i) < a[i] <= a[i + 1..r)
        quicksort(l, i);
        quicksort(i + 1, r);
    }
    // Post: a[l..r) is a sorted permutation of the initial array
}

void write()
{
    for(int i = 0; i < n; i++)
        fout << a[i] << " ";
}

int main()
{
    read();
    quicksort(0, n);
    write();
    return 0;
}