Cod sursa(job #1275262)

Utilizator alexandru.ghergutAlexandru-Gabriel Ghergut alexandru.ghergut Data 24 noiembrie 2014 22:28:04
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;

int getMin(int left, int right, int a[], int N);
int getMin(int left, int right, int a[], int N, int &pos);

#define max ((1 << 31) - 1)

int main()
{
    int N, i;
    ifstream f("algsort.in");
    f >> N;
    int a[N];
    int pieceSize = sqrt(N);
    int pieceNr;

    if (N % pieceSize == 0)
        pieceNr = N / pieceSize;
    else
        pieceNr = N / pieceSize + 1;

    for (i = 0; i < N; i++)
        f >> a[i];
    f.close();

    int v[pieceNr];
    for (i = 0; i < pieceNr; i++)
        v[i] = getMin(i * pieceSize, (i + 1) * pieceSize - 1, a, N);


    int j, min, pos;

    ofstream g("algsort.out");
    bool found;

    for (i = 0; i < N; i++)
    {
        found = false;
        min = getMin(0, pieceNr - 1, v, pieceNr, pos);
        for (j = pos * pieceSize; j < (pos + 1) * pieceSize && !found; j++)
            if (a[j] == min)
            {
                g << a[j] << " ";
                a[j] = -1;
                found = true;
            }
        v[pos] = getMin(pos * pieceSize, (pos + 1) * pieceSize - 1, a, N);
    }
    g.close();

    return 0;
}

int getMin(int left, int right, int a[], int N)
{
    bool found = false;
    int min = max;
    for (int i = left; i <= right && i < N; i++)
        if (a[i] > - 1 && a[i] < min)
         {
            found = true;
            min = a[i];
        }

    if (!found)
        return -1;

    return min;
}

int getMin(int left, int right, int a[], int N, int &pos)
{
    pos = -1;
    int min = max;
    bool found = false;
    for (int i = left; i <= right && i < N; i++)
        if (a[i] > - 1 && a[i] < min)
        {
            found = true;
            min = a[i];
            pos = i;
        }

    if (!found)
        return -1;
    return min;
}