Cod sursa(job #1499738)

Utilizator serbanSlincu Serban serban Data 11 octombrie 2015 00:45:18
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <bits/stdc++.h>

using namespace std;

struct numar{
    numar *next;
    int inf;
    int cate = 0;
};
numar *start;

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

    int n;
    int x[500005];
    f >> n;
    f >> x[1];

    numar *p = new numar;
    p->next = start;
    p->inf = x[1];
    p->cate = 1;
    start = p;

    for(int i = 2; i <= n; i ++) {
        f >> x[i];
        bool ok = false;
        for(numar *p = start; !ok && p; p = p->next) {
            if(p->inf == x[i])
                p->cate ++, ok = true;
        }
        if(!ok) {
            if(x[i] < start->inf) {
                numar *p = new numar;
                p->next = start;
                p->inf = x[i];
                p->cate = 1;
                start = p;
            }
            else {
                numar *p = start;
                for(; !ok && p->next; p = p->next) {
                    if(p->next->inf > x[i]) {
                        numar *nou = new numar;
                        nou->inf = x[i];
                        nou->next = p->next;
                        p->next = nou;
                        nou->cate = 1;
                        ok = true;
                    }
                }
                if(ok == false) {
                    numar *nou = new numar;
                    nou->inf = x[i];
                    nou->next = p->next;
                    p->next = nou;
                    nou->cate = 1;
                    p = NULL;
                }
            }
        }
    }

    int in = 0;
    for(numar *p = start; p; p = p->next) {
        in += p->cate;
        p->cate = in;
    }

    int ret[500005];
    for(int i = 1; i <= n; i ++) {
        bool ok = false;
        for(numar *p = start; p && !ok; p = p->next) {
            if(p->inf == x[i]) {
                ret[p->cate] = x[i];
                p->cate --;
                ok = true;
            }
        }
    }
    for(int i = 1; i <= n; i ++) {
        g << ret[i] << " ";
    }
    g << "\n";
    return 0;
}