Pagini recente » Cod sursa (job #1759559) | Cod sursa (job #3283421) | Cod sursa (job #3247180) | Cod sursa (job #3221725) | Cod sursa (job #1311398)
#include <algorithm>
#include <math.h>
using namespace std;
const int Nmax = 500005;
const int Lmax = 50000;
const int inf = 1;
int n;
int v[Nmax];
int u[Nmax];
int batog[Lmax];
int interval_len;
int nr_interval;
void update_interval(int k) {
// Get maximum element from an interval
int t = (k - 1) * interval_len;
int x = t + 1;
for (int j = 2; j <= interval_len && j + t <= n; ++j)
if (v[x] < v[t + j])
x = t + j;
batog[k] = x;
}
int main() {
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &v[i]);
// Set interval length and number of intervals
interval_len = sqrt(n) / 2;
if (!interval_len)
interval_len = 1;
nr_interval = n / interval_len;
if (nr_interval * interval_len < n) ++nr_interval;
// Build initial Smen of Batog array
for (int i = 1; i <= nr_interval; ++i)
update_interval(i);
int k = n;
for (int i = 1; i <= n; ++i) {
// Get maximum element from vector
int x = 1;
for (int j = 2; j <= nr_interval; ++j)
if (v[ batog[x] ] < v[ batog[j] ])
x = j;
// Add element to sorted array and update batog
u[k--] = v[ batog[x] ];
v[ batog[x] ] = -inf;
update_interval(x);
}
// Print sorted vector
for (int i = 1; i <= n; ++i)
printf("%d ", u[i]);
printf("\n");
return 0;
}