El ordenamiento por casilleros (bucket sort en ingls) es un algoritmo de ordenamiento que distribuye todos los elementos a ordenar entre un nmero finito de casilleros. Cada casillero slo puede contener los elementos que cumplan unas determinadas condiciones. En el ejemplo esas condiciones son intervalos de nmeros. Las condiciones deben ser excluyentes entre s, para evitar que un elemento pueda ser clasificado en dos casilleros distintos. Despus cada uno de esos casilleros se ordena individualmente con otro algoritmo de ordenacin (que podra ser distinto segn el casillero), o se aplica recursivamente este algoritmo para obtener casilleros con menos elementos. Se trata de una generalizacin del algoritmo Pigeonhole sort. Cuando los elementos a ordenar estn uniformemente distribuidos lacomplejidad computacional de este algoritmo es de O(n). El algoritmo contiene los siguientes pasos: 1. Crear una coleccin de casilleros vacos 2. Colocar cada elemento a ordenar en un nico casillero 3. Ordenar individualmente cada casillero 4. devolver los elementos de cada casillero concatenados por orden
Pseudocdigo
funcin bucket-sort(elementos, n) casilleros coleccin de n listas para i = 1 hasta longitud(elementos) hacer c buscar el casillero adecuado insertar elementos[i] en casillero[c] fin para para i = 1 hasta n hacer ordenar(casilleros[i]) fin para devolver la concatenacin de casilleros[1],..., casilleros[n] Aqu elementos es la lista de datos a ordenar y n el nmero de casilleros que queremos usar. Para buscar el casillero adecuado para un elemento se puede utilizar la tcnica que ms convenga, segn cmo queramos ordenar los datos. La funcin ordenar puede ser cualquier funcin de ordenamiento, incluso la propia bucket-sort.
Implementaciones
El algoritmo Bucket sort en Perl use constant BUCKET_SIZE => 10; sub bucket_sort { my ($array, $min, $max) = @_; array,
# y el mnimo y mximo de los posibles valores my $N = @$array or return; # Nmero de datos my $range = $max - $min; # Rango numrico de los datos my $N_BUCKET = $N / BUCKET_SIZE; # Nmero de elementos por casillero
my @bucket;
# Crear los casilleros for ( my $i = 0; $i < $N_BUCKET; $i++ ) { $bucket[ $i ] = [ ]; } # Llenar los casilleros for ( my $i = 0; $i < $N; $i++ ) { my $bucket = $N_BUCKET * (($array->[ $i ] - $min)/$range); push @{ $bucket[ $bucket ] }, $array->[ $i ]; } # Ordenar los casilleros for ( my $i = 0; $i < $N_BUCKET; $i++ ) { insertion_sort( $bucket[ $i ] ); # Aqu usamos ordenamiento por insercin } # Concatenar los casilleros @{ $array } = map { @{ $_ } } @bucket; }