Cod sursa(job #276279)

Utilizator dudu77tTudor Morar dudu77t Data 11 martie 2009 00:47:14
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <stdio.h>

struct list
{
    int val;
    struct list *next;
};

int n;
int a[500000];
list *unu = 0, *zero = 0;

void read();
void write();
void sort(int, int, int);

int main()
{
    read();
    sort(0, n - 1, 30);
    write();
    return 0;
}

void sort(int li, int ls, int nivel)
{
    if (li >= ls) return;
    else if (li == ls - 1)
    {
        if (a[li] > a[ls])
        {
            int tmp = a[li];
            a[li] = a[ls];
            a[ls] = tmp;
        }
        return;
    }
    if (nivel < 0) return;
    list *p;
    int i, k;
    for (i = li; i <= ls; ++i)
    {
        p = new list;
        p->val = a[i];
        if ((a[i] >> nivel) % 2)
        {
            p->next = unu;
            unu = p;
        }
        else
        {
            p->next = zero;
            zero = p;
        }
    }
    if (!zero)
    {
        while (unu)
        {
            p = unu;
            unu = unu->next;
            delete p;
        }
        sort(li, ls, nivel - 1);
        return;
    }
    if (!unu)
    {
        while (zero)
        {
            p = zero;
            zero = zero->next;
            delete p;
        }
        sort(li, ls, nivel - 1);
        return;
    }
    i = li - 1;
    while (zero)
    {
        a[++i] = zero->val;
        p = zero;
        zero = zero->next;
        delete p;
    }
    k = i;
    while (unu)
    {
        a[++i] = unu->val;
        p = unu;
        unu = unu->next;
        delete p;
    }
    sort (li, k, nivel - 1);
    sort (k + 1, ls, nivel - 1);
}

void write()
{
    int i;
    FILE *fout = fopen ("algsort.out", "w");
    for (i = 0; i < n; ++i)
    {
        fprintf (fout, "%d ", a[i]);
    }
    fclose (fout);
}

void read()
{
    int i;
    FILE *fin = fopen ("algsort.in", "r");
    fscanf (fin, "%d", &n);
    for (i = 0; i < n; ++i)
    {
        fscanf (fin, "%d", &a[i]);
    }
    fclose (fin);
}