public class CountSort
{
public void Sort(ref int[] a)
{
int n=a.Length-1;
int max = a[1];
for (int i = 2; i <= n; i++)
{
if (a[i] > max) max = a[i];
}
int[] c = new int[max+1];
for (int i = 1; i <= n; i++)
{
c[a[i]]++;
}
for (int i = 2; i <= max; i++)
{
c[i] = c[i] + c[i - 1];
}
int[] b = new int[n + 1];
for (int i = 1; i <= n; i++)
{
b[c[a[i]]] = a[i];
c[a[i]]--;
}
for (int i = 1; i <= n; i++)
{
a[i] = b[i];
}
}
}
public class BaseSort
{
int max=0;
void MaxLength(int[] a)
{
for(int i=0;i<a.Length;i++)
{
int n=1;
for (int j = 10; a[i] / j != 0; j *= 10)
n++;
if (n > max) max = n;
}
}
int GetDit(int x,int i)
{
int n;
n = x;
for (int m = 1; m <= i; m++)
n /= 10;
n %= 10;
return n;
}
public void Sort(ref int[] a)
{
ArrayList[] digit = new ArrayList[10];
for (int i = 0; i <10; i++)
digit[i] = new ArrayList();
MaxLength(a);
for (int i = 0; i < max; i++)
{
for(int j=0;j<a.Length;j++)
{
int n;
n = GetDit(a[j],i);
digit[n].Add(a[j]);
}
int k=0;
for (int t = 0; t < 10; t++)
{
if (digit[t].Count == 0) continue;
foreach (object obj in digit[t])
{
a[k++] = (int)obj;
}
}
for (int j = 0; j < digit.Length; j++)
digit[j].Clear();
}
}
}
}