Pagini recente » Rating Marius Petcu (Petcu_Marius_322CC) | Cod sursa (job #3215052) | Cod sursa (job #1309009) | Cod sursa (job #1094247) | Cod sursa (job #1275262)
#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;
}