using
System;
using
System.Collections.Generic;
namespace
RadixSort
{
class Radix
{
public void RadixSort(int[] a)
{
// Este es nuestro arreglo auxiliar.
int[] t=new int[a.Length];
// Tamaño en bits de
nuestro grupo.
// Intenta también 2, 8 o 16 para ver si es
rápido o no.
int r=2;
// Número de bits de un entero en c#.
int b=32;
// Inicia el conteo a asignación de los
arreglos.
// Notar dimensiones 2^r el cual es el
número de todos los valores posibles de un número r-bit.
int[] count=new int[1<<r];
int[] pref=new int[1<<r];
// Número de grupos.
int
groups=(int)Math.Ceiling((double)b/(double)r);
// Máscara para
identificar los grupos.
int mask = (1<<r)-1;
// Implementación del algoritmo
for (int c=0, shift=0; c<groups; c++, shift+=r)
{
// Reiniciar el conteo en los arreglos.
for (int j=0; j<count.Length; j++)
count[j]=0;
// Contar elementos del c-vo grupo.
for (int i=0; i<a.Length; i++)
count[(a[i]>>shift)&mask]++;
// Calculando prefijos.
pref[0]=0;
for (int i=1; i<count.Length; i++)
pref[i]=pref[i-1]+count[i-1];
// De a[] a t[]
elementos ordenados por c-vo grupo .
for (int i=0; i<a.Length; i++)
t[pref[(a[i]>>shift)&mask]++]=a[i];
// a[]=t[] e
inicia otra vez hasta el último grupo.
t.CopyTo(a,0);
Console.WriteLine("{0}",c);
}
// Está ordenado
}
public static
void Main(string[] args)
{
int[]
a = new int[7] {2,3,1,0,5,6,9};
Console.WriteLine("Ordenamiento
Radix");
Radix
O = new Radix();
O.RadixSort(a);
Console.ReadLine();
}
}
}
No hay comentarios:
Publicar un comentario