Pagini recente » Cod sursa (job #1984115) | Cod sursa (job #3001309) | Cod sursa (job #517679) | Cod sursa (job #612272) | Cod sursa (job #276279)
Cod sursa(job #276279)
#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);
}