Pagini recente » Cod sursa (job #2932461) | Cod sursa (job #1704115) | Cod sursa (job #1584456) | Cod sursa (job #101202) | Cod sursa (job #2268350)
#include <fstream>// INSERTION SORT + BATOG PENTRU LABORATOR ASD
#include <vector>
#include <queue>
#define NMAX 500001
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int a[NMAX], i, N, x, ok, d = 1, pozMin[1001], b[NMAX];
const int infinit = ((1 << 30) - 1) * 2 + 1;
int Querry(int st, int dr) {
int poz = st;
while (st % d != 0) {
if (a[st] < a[poz]) poz = st;
st++;
}
while (st + d <= dr) {
if (a[pozMin[st / d]] < a[poz]) poz = pozMin[st / d];
st += d;
}
while (st <= dr) {
if (a[st] < a[poz]) poz = st;
st++;
}
return poz;
}
void Update(int poz, int val) {
int Bucket = poz / d;
if(poz == pozMin[Bucket] ) {
a[poz] = val;
for(int i = Bucket * d; i < (Bucket + 1) * d; i++)
if (a[i] < a[pozMin[Bucket]]) pozMin[Bucket] = i;
}
else if (val < a[pozMin[Bucket]]) pozMin[Bucket] = poz;
a[poz] = val;
}
int main() {
f>>N;
for (i = 0; i < N; i++) {
f>>a[i];
}
while (d * d <= N) ++d;
for (i = 0; i < N; i++) {
if (i % d == 0) pozMin[i / d] = i;
if (a[i] < a[pozMin[i / d]]) pozMin[i / d] = i;
}
for (i = 0; i < N; i++) {
int poz = Querry(0, N-1);
b[i] = a[poz];
Update(poz, infinit);
}
for (i = 0; i < N; i++)
g<<b[i]<<' ';
return 0;
}