jueves, 10 de mayo de 2012

Código del Radix Sort.


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