Cod sursa(job #1849104)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 17 ianuarie 2017 00:12:57
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stdlib.h>
#define NMAX 500001
#define BUFF_SIZE 100001

using namespace std;

int A[NMAX], n;
ifstream in("algsort.in");
ofstream out("algsort.out");
char buff[BUFF_SIZE];
int pos = 0;

void Read (int &a)
{
    while (!isdigit(buff[pos]))
        if (++pos == BUFF_SIZE)
            in.read(buff, BUFF_SIZE), pos = 0;
    a = 0;
    while (isdigit(buff[pos]))
    {
        a = a * 10 + (buff[pos] - '0');
        if (++pos == BUFF_SIZE)
            in.read(buff, BUFF_SIZE), pos = 0;
    }
}

int piv (int x, int y)
{
    int pv[3];
    pv[0] = rand() % (y - x + 1) + x;
    pv[1] = rand() % (y - x + 1) + x;
    pv[2] = rand() % (y - x + 1) + x;
    if (pv[0] > pv[1])
        swap (pv[0], pv[1]);
    if (pv[0] > pv[2])
        swap (pv[0], pv[2]);
    if (pv[1] > pv[2])
        swap (pv[1], pv[2]);
    return pv[2];
}

void quicksort (int x, int y)
{
    if (x < y)
    {
        int i = x, j = y;
        int pivot = A[piv (x, y)];
        while (i <= j)
        {
            while (A[i] < pivot)
                ++i;
            while (A[j] > pivot)
                --j;
            if (i <= j)
            {
                swap(A[i], A[j]);
                ++i;
                --j;
            }
        }
        if (i < y)
            quicksort(i, y);
        if (j > x)
            quicksort(x, j);
    }
}

int main()
{
    Read(n);
    for (int i = 1; i <= n; ++i)
        Read(A[i]);
    in.close();
    quicksort(1, n);
    for (int i = 1; i <= n; ++i)
        out << A[i] << " ";
    out.close();
    return 0;
}