Tengo que ordenar una serie de enteros, que pueden tener valores entre 30.000.000 y 350.000.000. Habrá entre 0 y 65.535 enteros, con un recuento promedio de 20.000. El uso de RAM es irrelevante y la velocidad solo es importante.¿Cuál es el algoritmo de ordenación más rápido para enteros 0-65535?
Más adelante también tendré que dividirlos en grupos, siempre con la división siempre que la brecha entre dos de estos valores sea> 65.535, que es para lo que necesito el algoritmo.
Si hace alguna diferencia, el algoritmo se usará en una secuencia de comandos de Perl.
Editar: Después de pensarlo y leer las respuestas me he dado cuenta de algo: en realidad no me importan los datos en sí. Como realmente solo quiero encontrar los valores de inicio y fin de grupos con espacios pequeños, la ordenación solo necesita crear divisiones y puede descartar los datos.
Edit2: Después de algunas pruebas y probar las respuestas proporcionadas, la manera más rápida que encontré fue esto:
my @sort = sort {$a <=> $b} @item_offsets;
my @buckets;
my $start = shift @sort;
push @buckets, [$start,$start];
for my $item (@sort) {
if ($item < $buckets[$#buckets][1]+$gap) {
$buckets[$#buckets][1] = $item;
}
else {
push @buckets, [$item,$item];
}
}
say $#buckets;
Logró resumir los problemas realmente bien. De hecho, mientras leía las respuestas aquí, reflexioné sobre hacer algo así, pero aún no estaba muy seguro. Gracias. :) – Mithaldu
Acabo de editar mi respuesta y descarté un poco de texto no relacionado, en función de sus ediciones. La respuesta resultante debería ser mucho más rápida, aunque ambos fueron algoritmos de tiempo lineal. – Brian