Cod sursa(job #1837766)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 30 decembrie 2016 14:08:13
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");

const int NMAX = 500005;
const int SQRT = 1 << 16;

class List {
  public:
    int v;
    int nxt;
    List() {}
    List(int _v, int _nxt) {
        v = _v;
        nxt = _nxt;
    }
};

int c;
int fi[2 * SQRT + 1];
List l[2 * SQRT + 1];

inline void listPrepend(int i, int v) {
    c++;
    l[c] = List(v, fi[i]);
    fi[i] = c;
}

int n;
int a[NMAX];
int b[NMAX];

void bucketSort() {
    memset(fi, -1, sizeof fi);
    for (int i = 1; i <= n; i++) {
        int j = (a[i] % SQRT);
        listPrepend(j, a[i]);
    }
    for (int i = 0; i < SQRT; i++) {
        for (int j = fi[i]; j != -1; j = l[j].nxt) {
            int k = (l[j].v / SQRT) + SQRT;
            listPrepend(k, l[j].v);
        }
    }
    int p = n;
    for (int i = 2 * SQRT; i >= SQRT; i--) {
        for (int j = fi[i]; j != -1; j = l[j].nxt) {
            b[p] = l[j].v;
            p--;
        }
    }
}

int main() {
    f >> n;
    for (int i = 1; i <= n; i++) {
        f >> a[i];
    }
    bucketSort();
    for (int i = 1; i <= n; i++) {
        g << b[i] << " ";
    }
    return 0;
}