Cod sursa(job #1850475)

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

using namespace std;

#define MAX 500010
/*
void afis(int batog[], int rad) {
    for (int i = 0; i < rad; i++) {
        cout << batog[i] << " ";
    }

    cout << "\n";
}

void afisv(int v[], int n) {
    for (int i = 0; i < n; i++) {
        cout << v[i] << " ";
    }

    cout << "\n";
}*/

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));
    //printf("rad=%d\n", rad);

    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;
            }
        }
    }

    //afis(batog, rad);
    //afisv(v, n);

    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;
            }
        }

        //printf("minim=%d\n", minim);

        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;
            }
        }

        //printf("minnou=%d\n", minnou);
        batog[minim] = minnou;
        //afis(batog, rad);
        //afisv(v, n);
    }

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

    return 0;
}