¿Cuál es un método eficiente para ordenar una matriz?

Puede hacer esto en tiempo lineal en una sola pasada.
La clave es notar que solo necesita preservar las relaciones de comparación entre vecinos inmediatos. Así es cómo:

Los primeros dos elementos ya están ordenados por meneo, porque su orden no importa.

Digamos que las primeras n posiciones de la matriz ya están ordenadas y A [n-1] A [n -1]).

Deje que el orden ordenado de (A [n-1], A [n], A [n + 1]) sea (m1, m2, m3).
Afirmo que si asigna A [n-1] = m1, A [n] = m3, A [n + 1] = m2, los primeros n + 1 elementos se ordenarán de forma ondulada.

Prueba:
– Los primeros elementos n-2 no se modifican, por lo tanto, desde el supuesto de que se clasificaron de forma ondulada, todavía se ordenan de forma ondulada.
– Teníamos A [n-2]> A [n-1] antes, así que definitivamente tenemos A [n-2]> m1.
– Tenemos m1 m2, por lo que A [n-1], A [n], A [n + 1] continúa el patrón de meneo.

Si A [n-1]> A [n], desea asignar A [n-1] = m3, A [n] = m1, A [n + 1] = m2, y la prueba es la misma.

Repita esto hasta que todos los elementos se ordenen.

En tu ejemplo:

n = 2: 1, 2, 8, 9, 3, 5 (matriz inicial)
n = 3: 1, 8, 2, 9, 3, 5
n = 4: 1, 9, 2, 8, 3, 5
n = 5: 1, 9, 2, 8, 3, 5
n = 6: 1, 9, 2, 8, 3, 5

¡Buena pregunta!
He buscado código y modificado un poco, puedes echar un vistazo.

Referencia:
Entrevista de Google – Clasificación de meneo

orden público vacío (int [] arr) {
if (arr == null || arr.length == 0)
regreso;

int len ​​= arr.length;
int pre = arr [0];
boolean inc = verdadero;

para (int i = 1; i if ((inc && pre <= arr [i]) ||
(! inc && pre> = arr [i])) {
arr [i – 1] = pre;
pre = arr [i];
}
más
arr [i – 1] = arr [i];

inc =! inc;
}
arr [len – 1] = pre;
}

Una solución muy rápida es encontrar el mínimo de la matriz y el máximo y colocarlos en las dos primeras posiciones, y luego reiniciar desde el índice 2.

Otra solución rápida es usar el método de clasificación que prefiera y luego volver a empaquetar los datos comenzando desde ambos extremos de la matriz.

Este es mi código en Python:

def wiggleSort (nums):
bandera = verdadero
para i en xrange (len (nums) -1):
if (bandera y números [i]> números [i + 1]) o \
(no bandera y números [i] nums [i], nums [i + 1] = nums [i + 1], nums [i]
i + = 1
bandera = no bandera

More Interesting

¿Cuál es la diferencia entre a ++ y ++ a? ¿La salida de la operación depende del compilador?

¿Por qué EPFL no produce grandes programadores que puedan descifrar entrevistas técnicas de compañías como Google, Facebook, Palantir, Amazon, etc.?

¿Dónde puedo encontrar una lista de implementaciones de algoritmos estándar en C, C ++ y Java?

¿Cuáles son algunas preguntas que un empleador podría hacer sobre Swift durante una entrevista de trabajo para desarrolladores de iOS? ¿Qué tipo de respuestas esperaría él o ella?

Cómo diferenciar entre Declaración y Definición de una variable

¿Cómo te sientes cuando crees que te has desempeñado increíblemente bien en una entrevista pero aún te rechazan?

¿Cuál sería mejor para una entrevista de Google para la codificación de pizarra, etc., Java o C ++?

¿Cómo podemos encontrar el árbol de búsqueda binario más grande en un árbol binario de manera eficiente?

Si hay una matriz que contiene N números, cuyo rango es de 1 a N + 1, y solo puedo usar el espacio O (1) y no puedo modificar la matriz, ¿puedo encontrar cualquier número repetido no peor que O (NlogN) ¿hora?

Escriba un programa para verificar si un elemento dado está en una matriz ordenada. ¿Cuál es su complejidad temporal?

Cómo mejorar en la resolución lógica de problemas algorítmicos para entrevistas técnicas

¿Cuál es su revisión del material C ++ en GeeksforGeeks?

¿Cuál es la diferencia entre el comportamiento indefinido, no especificado y la implementación definida?

¿Cómo diseñas una función rand7 usando una función rand5?

¿Cómo encuentra la distancia de edición entre una cadena dada y un RegExp?