Cod sursa(job #1315766)

Utilizator obidanDan Ganea obidan Data 13 ianuarie 2015 03:16:33
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <cmath>
using namespace std;
const int NMax = 500002;
int v[NMax];
int u[NMax];
int Intervals[800];
int interval_len;
int nrintervals;
int n;
void Update_Interval(int i)
{
    int minim=INFINITY,pozminim;
    for(int j = (i-1) * interval_len + 1 ; (j<=i * interval_len) && (j<=n) ; j++)
    {
        if(v[j]< minim)
        {
            minim = v[j];
            pozminim = j;
        }
    }
    Intervals[i]= minim;
    v[pozminim]= INFINITY;

}

int getMin()
{
    int pozminim,minim = INFINITY;
    for(int i=1;i<=nrintervals;i++)
    {
        if(Intervals[i]< minim)
        {
            minim = Intervals[i];
            pozminim = i;
        }
    }
    Update_Interval(pozminim);
    return minim;

}

void BatogSort()
{
    int i;
    interval_len  = sqrt(n);
    nrintervals = n/interval_len;
    if (!interval_len)
        interval_len = 1;
    if (nrintervals*interval_len<n) ++nrintervals;
    int k = 1;
    //Build initial Array
    for(i=1;i<=nrintervals;i++)
    {
        Update_Interval(i);
    }

    for(i=1;i<=n;i++)
    {
        u[k++]=getMin();
    }

}


int main()
{
    int i;
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>v[i];
    }
    BatogSort();
    for(i=1;i<=n;i++)
        cout<<u[i]<<" ";


}