Digamos que tengo una lista como [3, 0, 4, 2, 1]
, y utilizo el ordenamiento por selección para ordenarlo, podría visualizarlo así:
3,0,4,2,1
|-|
0,3,4,2,1
|-----|
0,1,4,2,3
|-|
0,1,2,4,3
|-|
0,1,2,3,4
Este desafío se trata de visualizar una clasificación como esta.
Entrada
Su entrada será una lista de enteros positivos, en cualquier formato que desee.
Tarea
Su envío debe ordenar la lista de entrada intercambiando solo dos elementos a la vez, y en cada intercambio, el envío debe mostrar la lista y un carácter debajo de cada uno de los elementos que se intercambian. Si un número que se intercambió tiene más de un dígito, el carácter puede estar debajo de él. Al final, el envío debe mostrar la lista ordenada.
Otras reglas
- La ordenación debe usar menos intercambios que n 4 , donde n es la longitud de la lista.
- La clasificación no tiene que ser determinista.
- Los caracteres debajo del intercambiado pueden ser cualquier carácter excepto el espacio.
n^4
? Estás siendo un poco generoso aquí.0
(por favor, corrija solo el ejemplo para no invalidar las respuestas que no pueden manejar 0)Respuestas:
Perl, 62 bytes
Incluye +3 para
-p
Dé entrada como una sola línea de números en STDIN:
Cambia repetidamente la primera inversión. La complejidad del intercambio es
O(n^2)
, la complejidad del tiempo esO(n^3)
. Utiliza los números que se intercambian como marca:visisort.pl
:El programa también admite valores negativos y números de coma flotante.
Si insiste en un carácter de conexión, el código se convierte en 66 bytes:
Pero ahora ya no admite números negativos y 0 (pero el programa solo tiene que admitir enteros positivos de todos modos. En
0
el ejemplo es un error)fuente
The characters under the swapped can be any char except space.
no debe tener espacios entre el número en la línea de la marca_
debajo del primer dígito, lo que significa que todos los caracteres intermedios serían espacios). Así que mantengo mi interpretación (a menos que el OP no esté de acuerdo, por supuesto). Buit solo para hacerte feliz También agregué una versión sin espacio :-)JavaScript (ES6), 158 bytes
Ordenamiento de burbuja. Salida de muestra:
fuente
-
debajo de,
y luego los dos|
s siempre estarán debajo de los números adyacentes.PHP, 248 bytes
Bubblesort aburrido gana
PHP, 266 bytes de una manera con array_slice y min
salida modificada en
I X
lugar de*~~*
282 bytes
Cómo funciona
Busca el mínimo en una matriz y toma esto en la primera posición. Busca el mínimo sin la primera posición ... y así sucesivamente. Si un valor es el doble, se intercambiará el primer valor.
Ejemplo de salida
fuente
echo$t."\n";
, puede usarecho"$t\n";
y guardar un byte.Haskell,
165164162 bytesEsto visualiza el tipo de selección. Ejemplo de uso:
Cómo funciona:
s % c
es una función auxiliar que hacelength (show s) - 2
copias de caracteresc
. Se usa para el espaciado antes de ambos|
, una vez conc == ' '
y una vez conc == '-'
.La función principal
#
toma una listap
que es la parte ordenada de la lista yx
que es la parte aún por clasificar. La coincidencia de patrón(h,t:s)<-span(/=minimum x)x
divide la listax
en su elemento mínimo y se uneh
a la parte anterior al mínimo,t
al mínimo mismo ys
a la parte posterior al mínimo. El resto es formatear dos líneas: 1) la lista en su estado actual (p++x
) y 2) la|----|
parte seguida de una llamada recursiva de#
cont
agregado ap
y la cabeza deh
insertada entre la cola deh
ys
.PD: funciona también con números negativos y / o de coma flotante:
Editar: @BlackCap guardó 2 bytes. ¡Gracias!
fuente
id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]
Python 2, 267 bytes
Funciona con decimales y números negativos también.
Ejemplo:
fuente
JavaScript (ES6), 147
155Usar n * n se compara, pero (creo) el número mínimo de intercambios. Y las posiciones de intercambio son más variables en comparación con el tipo de burbuja aburrida.
Menos golf y con suerte más comprensible
Prueba
fuente
Java 7
256 241282 bytesGracias a @Geobits y @Axelh por guardar 15 bytes
Sin golf
salida
fuente
out
, debe poner algo comoPrintStream out=System.out;
en algún lugar de su código.out
, debe usar un ternario en lugar deif/else
si va a imprimir en ambas ramas. Algo así como enout.print(a>b?a:b);
lugar deif(a>b)out.print(a);else out.print(b);
if(j==i|j==m)out.print(a[j]);out.print(" ");
o incluso mejor con un ternarioout.print((j==i|j==m?a[j]:" ")+" ");
y luego puede eliminar {} del bucle PS: utilizo una importación estática para la instancia de salida, si está bien;)System.
frente a laout
s), y que le falta la2
y3
en los dos últimos swap líneas.for(j=0;j<=m&i!=l-1;j++)
Jalea , 36 bytes
Pruébalo en línea!
Explicación
El ejemplo que se muestra en el enlace TIO es particularmente difícil para este programa; la
;0
cerca del inicio es necesario asegurarse de que el bucle termina justo en el punto donde la entrada se vuelve a ordenar. Esto normalmente no es necesario (porque terminará después de una iteración más), pero si el último intercambio es de los primeros dos elementos (como se ve aquí), la iteración de uno más no sucederá y hace que sea imposible terminar La lista consistentemente. Como tal, debemos asegurarnos de no intercambiar nada en la última iteración del bucle.fuente