Un algoritmo in-place transforma los datos usando una cantidad pequeña de memoria auxiliar, normalmente O(1) o O(log n) según si se cuenta el call stack.
No significa que “no use memoria”. La entrada ya ocupa memoria, existen variables locales y puede haber stack. La afirmación se refiere a memoria adicional que crece con n.
La mutación puede ahorrar copias, pero también cambia el contrato de la función y aumenta el riesgo de efectos laterales.
functionreverseInPlace<T>(values:T[]):void{let left =0;let right = values.length -1;while(left < right){[values[left], values[right]]=[values[right], values[left]];
left +=1;
right -=1;}}
La versión anterior conserva el orden relativo porque escribe los valores en el mismo orden en que los lee.
Si el orden no importa, puedes reemplazar un valor eliminado con el último elemento y reducir el límite. Puede hacer menos escrituras, pero cambia el orden.
TypeScript
functionremoveUnordered<T>(values:T[], target:T):number{let index =0;let length = values.length;while(index < length){if(Object.is(values[index], target)){
values[index]= values[length -1];
length -=1;}else{
index +=1;}}return length;}
La elección depende del contrato, no solo de velocidad.
functionsortColors(values:number[]):void{let low =0;let current =0;let high = values.length -1;while(current <= high){if(values[current]===0){[values[low], values[current]]=[values[current], values[low]];
low +=1;
current +=1;}elseif(values[current]===2){[values[current], values[high]]=[values[high], values[current]];
high -=1;}else{
current +=1;}}}
Invariante:
Texto
[0..low) ceros
[low..current) unos
[current..high] desconocidos
(high..n) doses
Después de intercambiar con high, no avanzas current porque el valor recibido todavía no se ha clasificado.
Algunas permutaciones in-place se descomponen en ciclos. Guardas un valor temporal y mueves cada elemento a su destino hasta regresar al inicio.
El reto es marcar qué posiciones ya fueron procesadas sin usar O(n) memoria. A veces la entrada permite codificar marcas; otras veces no. No fuerces una solución in-place si destruye claridad o exige supuestos no disponibles.
¿Por qué después de intercambiar values[current] con values[high] en Dutch National Flag no se incrementa current?
Respuesta
Porque el valor que llegó desde high todavía pertenece a la región desconocida. Debe clasificarse antes de avanzar; hacerlo de inmediato podría dejarlo en la región incorrecta.