Cod sursa(job #1850478)

Utilizator stefanmereutaStefan Mereuta stefanmereuta Data 18 ianuarie 2017 18:10:57
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
//batog
#include <iostream>
#include <math.h>
#include <fstream>

using namespace std;

#define MAX 500010

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

    //batog - indici
    int n, v[MAX], batog[750], rad, minim, minnou;

    fin >> n;

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

    rad = ceil(sqrt(n));

    for (int i = 0; i < rad && i * rad < n; i++) {
        batog[i] = i * rad;

        for (int j = 1; j < rad && i * rad + j < n; j++) {
            if (v[i * rad + j] < v[batog[i]]) {
                batog[i] = i * rad + j;
            }
        }
    }

    for (int i = 0; i < n; i++) {
        //minim - indicele minimului din vector in batog
        //minnou - indicele in vector al noului minim din acel segment
        minim = 0;

        for (int j = 1; j < rad && j * rad < n; j++) {
            if (v[batog[j]] < v[batog[minim]]) {
                minim = j;
            }
        }

        fout << v[batog[minim]] << " ";

        minnou = minim * rad;

        v[batog[minim]] = 2147483647;

        for (int j = minim * rad + 1; j < (minim + 1) * rad && j < n; j++) {
            if (v[j] < v[minnou]) {
                minnou = j;
            }
        }

        batog[minim] = minnou;
    }

    fin.close();
    fout.close();

    return 0;
}