[Archivo] Matemáticas puras, física, química, etc.: problemas de entrenamiento cerebral no relacionados con el comercio de ninguna manera - página 584

 
alsu:

En una sola pasada:

Crear una copia vacía de un array del mismo tamaño, inicializarlo con dos.

Ir desde el principio de la matriz. Encuentro 1 - escribir en la copia desde el principio, encuentro 3 - escribir en la copia desde el final.


¿Y inicializar de dos en dos (66% de media inútil) no es una pasada?
Además, ¡tienes que controlar a los tres punteros al mismo tiempo!
 
GaryKa:

Te daré una pequeña tarea.

Por supuesto, es un hack, pero en las entrevistas de trabajo funciona como una apoteosis de conocimiento de ordenación de matrices ))


Por lo tanto, la tarea de clasificar

Hay una matriz de N celdas, en la que los unos, los dos y los tres están colocados en orden aleatorio.

Construye el mejor algoritmo de ordenación.


Cuenta en una pasada, rellena la matriz en la segunda pasada.
 
alsu:

En una sola pasada:

Crear una copia vacía de un array del mismo tamaño, inicializarlo con dos.

Ir desde el principio de la matriz. Si se encuentra 1, se escribe en la copia desde el principio; si se encuentra 3, se escribe en la copia desde el final.

Sin copia (o dirá que rellenar la copia es una pasada aparte).

n=0, m=0

Empieza por el principio de la matriz. Si nos encontramos con 1 - lo cambiamos por el n-ésimo elemento del principio, no igual a 1 (por construcción siempre será 2), n++; si nos encontramos con 3 - lo cambiamos por el m-ésimo elemento del final, no igual a 3, m++, y si nos encontramos con 1, seguimos los pasos de la primera parte.

 
alsu:

Sin copia (o dirá que rellenar la copia es una pasada aparte)

n=0, m=0

Vamos desde el principio de la matriz. Si nos encontramos con 1, lo cambiamos por el n-ésimo elemento del principio no igual a 1 (por construcción siempre será 2), n++; si nos encontramos con 3, lo cambiamos por el m-ésimo elemento del final no igual a 3, m++, y si nos encontramos con 1, procedemos como se describe en la primera parte.


una media de medio pase, más la misma cantidad de tiempo para los intercambios
 
alsu:

Sin copia (o dirá que rellenar la copia es una pasada aparte)

n=0, m=0

Vamos desde el principio de la matriz. Si nos encontramos con 1, lo cambiamos por el n-ésimo elemento del principio no igual a 1 (por construcción siempre será 2), n++; si nos encontramos con 3, lo cambiamos por el m-ésimo elemento del final no igual a 3, m++, y si nos encontramos con 1, procedemos como se describe en la primera parte.



Es una buena manera de hacerlo.
 
alsu:
Reducir el número de pasadas no siempre supone un aumento de la velocidad.
 
Intercambiar dos elementos de un array son 3 operaciones. Es poco probable que sea más rápido.
 
TheXpert:
Reducir el número de pasadas no siempre supone un aumento de la velocidad.
Bueno, el criterio de optimalidad no está establecido...
 
Permítanme plantear una pregunta:
A+B=...
 
alsu:

Sin copia (o dirá que rellenar la copia es una pasada aparte)

n=0, m=0

Vamos desde el principio de la matriz. Si nos encontramos con 1, lo cambiamos por el n-ésimo elemento del principio no igual a 1 (por construcción siempre será 2), n++; si nos encontramos con 3, lo cambiamos por el m-ésimo elemento del final no igual a 3, m++, y si nos encontramos con 1, procedemos como se describe en la primera parte.



Buena idea.