Pagini recente » Cod sursa (job #1123474) | Cod sursa (job #1150705) | Cod sursa (job #474605) | sandwich | Cod sursa (job #1037296)
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include<cstdlib>
using namespace std;
#define MAXN 500001
#define INF 1<<30
int main()
{
int n, v[MAXN];
FILE *f = fopen("algsort.in", "r");
FILE *g = fopen("algsort.out", "w");
fscanf(f, "%d", &n);
for (int i = 0; i < n; i++)
{
fscanf(f, "%d", &v[i]);
}
int len = sqrt(n);
int lenInt = n / len;
if ( len * len != n )
{
len ++;
}
int vnou[MAXN], pozitii[MAXN], k = 0;
//memset(vnou, INF, n);
for (int i = 0 ; i < n; i++)
vnou[i] = INF;
for (int i = 0; i < n; i++)
{
if ( v[i] < vnou[i / lenInt] )
{
vnou[i / lenInt] = v[i];
pozitii[i / lenInt] = i;
}
}
int indiceMin = 0;
for (int j = 0; j < n; j++)
{
int min = INF;
for (int i = 0; i < len; i++)
{
if (min > vnou[i])
{
min = vnou[i];
indiceMin = pozitii[i];
}
}
fprintf(g, "%d ", min);
v[indiceMin] = INF;
vnou[indiceMin / lenInt] = INF;
for (int z = (indiceMin / lenInt) * lenInt; z < ((indiceMin / lenInt) + 1) * lenInt && z < n; z++)
{
if (v[z] < vnou[indiceMin / lenInt])
{
vnou[indiceMin / lenInt] = v[z];
pozitii[indiceMin / lenInt] = z;
}
}
}
fclose(f); fclose(g);
return 0;
}