¿Cómo organizaría (en el lugar) el siguiente elemento de la mitad del arreglo alternativamente entre el elemento de la primera mitad del arreglo?

Aquí hay un documento al respecto: Un algoritmo simple en el lugar para In-Shuffle (enlace pdf).

El problema es mucho más difícil de lo que parece. La respuesta de Naveen tuvo el enfoque correcto, pero supuso que un solo ciclo cubrirá todos los números, lo cual no es cierto. La permutación para organizar la matriz de longitud 8 tiene un ciclo de descomposición de (0) (124) (365) (7). (Ver notación de ciclo)

Para resumir el artículo:
1) Resuelva el problema por una longitud con descomposiciones de ciclo fáciles.
– Las matrices de longitud 3 ^ k – 1 pueden descomponerse en k ciclos disjuntos que comienzan en 3 ^ i para i en {0, …, k-1}. Esos ciclos se pueden cambiar individualmente para colocar los elementos en su posición correcta.
2) Aplique recursivamente eso para resolver la longitud arbitraria de la matriz.
– Si la matriz está representada por las submatrices A1 + A2 + A3 + A4, donde A1 + A3 tiene una longitud de 3 ^ k – 1, puede invertir A2 + A3 y luego invertirlas individualmente para obtener A1 + A3 + A2 + A4. Ahora puede ejecutar el primer paso en A1 + A3 y recurrir en A2 + A4.

Editar: ese documento aparentemente resuelve un problema diferente, 012345 -> 304152, en lugar de 012345 -> 031425. Pero en realidad podemos reducir este problema al problema en el papel al cambiar dos números de marcador de posición: 012xy345 -> y031425x. (o simplemente intercambie cada dos elementos antes de comenzar como se sugiere en los comentarios: 304152 -> 031425)

Una buena pregunta …
Este es el primer algo que se me ocurrió después de ver la pregunta.

Deje que el tamaño de la matriz sea n y la matriz sea una matriz basada en 0.

1) Comience desde el segundo elemento

2) Deje que el índice sea i. Entonces
a) Si (i b) otra posición nueva = (2 * i + 1)% n

3) Mueva el elemento actual a esta nueva posición. Antes de mover, guarde el elemento existente en una variable temporal.

4) Haz lo mismo con ese elemento ya existente.

5) haga lo siguiente para las iteraciones n-2. (Entonces, la idea detrás de esto es que el primer elemento y el último elemento no serán tocados)

Complejidad de tiempo: O (n)

No pude encontrar ningún caso donde esto falla. Avísame si hay 🙂

Nota: Un algoritmo de complejidad menor que O (n) no es posible para esta pregunta porque requiere elementos visitantes / móviles (n-2) en cualquier caso

Actualizar:
Este algoritmo no funciona para valores de n para los cuales el recorrido necesita más de un ciclo. Un ejemplo de esto es n = 10

More Interesting

¿Cuáles son las preguntas técnicas que se hacen durante la entrevista en el sitio como desarrollador front-end?

¿Es extraño que una empresa envíe un correo electrónico a todos los solicitantes como grupo (no bcc), eliminando así la privacidad en el proceso de solicitud?

¿Qué programa de preparación de entrevistas es mejor?

¿Qué tipo de preguntas le hicieron en su entrevista los reclutadores de Amazon? ¿Como de la estructura de datos, algoritmos, programación?

¿Cómo cambiaría los elementos (en su lugar) de una matriz como [A1, A2, A3, A4, B1, B2, B3, B4] para convertirlo en [A1, B1, A2, B2, A3, B3, A4, B4 ]?

Cómo prepararme para limpiar la entrevista para Amazon India como WDE (Ingeniero de desarrollo web)

Dada una matriz de n números, ¿cuál es el algoritmo para encontrar la cantidad total de subsecuencias de la matriz que están en progresión aritmética?

¿Qué son buenas para evaluar las entrevistas con algoritmos de codificación?

¿Debo usar TopCoder o el libro Cracking the Coding Interview?

Dada una matriz de entrada de enteros de tamaño n, y una matriz de consulta de enteros de tamaño k, ¿cómo encuentro la ventana más pequeña de la matriz de entrada que contiene todos los elementos de la matriz de consulta, preservando el orden?

¿Qué necesito saber sobre el recolector de basura en Java para una entrevista técnica?

Dado un número de dígito d1d2d3 ... dn, ¿de cuántas maneras podemos evaluar que la expresión sea un número X insertando + o -?

¿Cómo puedo convertir la lista [[1], [2], [3]] en [1, 2, 3] en Python? Básicamente, quiero que la lista sea aplanada.

Dado un flujo continuo de enteros, ¿podemos encontrar el máximo dado cualquier rango arbitrario (a, b) en el tiempo O (log t)?

Una pequeña empresa me ha pedido que escriba un fragmento de su nueva API como un desafío de codificación y lo envíe a una sucursal privada para su revisión. ¿Debería hacerlo?