2011-10-15 19 views
6

¿Cuál es el mejor método para ordenando una pila en orden ascendente? I se encontró con esta pregunta de la entrevista y me encontré con algunos problemas para encontrar la mejor y más eficiente solución.Ordenando una pila en orden ascendente?

Hay dos métodos que se me ocurren.

  1. hacer estallar todos los contenidos de la pila y almacenarlos en una matriz, y luego ordenar la matriz en
    O(nLog n) y luego empujar el contenido copia de la pila. No es la mejor manera ....

  2. Haz la aplicación recursiva de la pila para la clasificación que

void sort(stack) 
{ 
    type x; 

    if (!isEmpty(stack)) { 
     x = pop(stack); 
     sort(stack); 
     insert(x, stack); 
    }   
} 

void insert(x, stack) 
{ 
    type y; 

    if (!isEmpty(stack) && top(stack) < x) { 
     y = pop(stack); 
     insert(x, stack); 
     push(y, stack); 
    } 
    else { 
     push(x, stack); 
    } 
} 

Pero el segundo método parece estar haciendo demasiadas llamadas recursivas y la sobrecarga será un problema si la pila pasa a ser realmente grande.

¿Es posible resolver este problema de una manera mucho mejor para la mejor complejidad de espacio y tiempo?

Hay tantas llamadas recursivas, (subproblemas superpuestos), ¿esto es un contendiente para el tipo de problemas dynamic programming?

¿Cuál sería la mejor manera de resolver esto? ?

+3

¿Por qué el tiempo de clasificación 'O (n * log n)' es subóptimo? Para el caso general, ese es el límite comprobado. –

+0

No se puede hacer mejor que 'O (n)' espacio y 'O (n log n)' tiempo. Hacer estallar en una matriz, clasificar y empujar es óptimo. – avakar

+0

@avakar: ¿Tiene una prueba para el primer reclamo ("no se puede hacer mejor que' O (n) 'espacio")? – NPE

Respuesta

3

Es una pila. No puedes ver nada más que el valor superior. Tendrás que abrir todo al menos una vez e insertar todo al menos una vez. El primer método está bien.

Si las operaciones de la pila son costosas pero tiene un límite de tiempo, utilice la ordenación por inserción a medida que está apareciendo y puede presionar tan pronto como finalice su última operación. Pero estás diciendo que esto está en C++, así que dudo que estemos considerando tal escenario.

+0

Está en C. Disculpas! – Legolas

3

Lo puede resolver eliminando la recursión. Para esto, simplemente usa un bucle que itera debajo de una pila hasta que esté vacío.

Por ejemplo, la pseudo código:

Linekd Stack stack = new List(); 

while stack is not empty then 

    element <- stack removes peek 

    // Recursiong 
    push new elements on stack 

end 
+0

No creo que este pseudocódigo sea aplicable. – Legolas

+0

Puede simular una recursión con bucle de iteración y estructura de datos de la pila –

+0

¿No es lo mismo? La recursividad hace que las llamadas a funciones entren en la memoria de la pila, y es la misma implementación. – Legolas

-1

Este problema no puede tener menos de complejidad O (n^2). Para referencia adicional, refiera here

+0

enlace está roto ... – Legolas

+0

Por favor, consulte de nuevo la pregunta. (1) lo logra. – Legolas

+0

"Este algoritmo tendrá un tiempo complejidad de O (N^2). "no significa que O (N^2) es óptimo y en este caso es trivial lograrlo en O (N lg N) como se describe en la pregunta misma. – quasiverse

Cuestiones relacionadas