Interesante....
Aquí el problema es que encuentra un 0 en la posición [1]
Entonces inicia los intercambios para desplazarlo al final.
Pero claro, el primer intercambio lo hace con otro 0....
Entonces, al terminar los intercambios, se considera que la posición [1] ha quedado "corregida", pero resulta que ahí se ha quedado el 0 con el que se ha intercambiado la primera vez.
He pensado que quizás sea más óptimo comenzar el vector por el final y recorrerlo en orden invertido, hacia atrás.
Al encontrar un 0, iniciamos los intercambios, ahora sí hacia delante.
He escrito este código y parece funcionar.....
Sin embargo, no me convencía del todo y al probarlo con un vector más variado en posibilidades donde encontrar ceros, no termina de funcionar del todo bien.
Por ejemplo con este vector:
Da este resultado, que es incorrecto porque no desplaza todos los ceros, y además invierte el orden de 1 respecto al 4
Habrá que darle más vueltas al asunto, por desgracia ahora no tengo tiempo.
Otra cosa que se me ocurre es recorrer el vector de forma normal y extraer los valores a otros dos vectores temporales.
En uno se extraen los valores distintos de cero y en otro solo los ceros.
Luego, se crea un nuevo vector definitivo "fusionando" eso dos vectores temporales en uno solo, poniendo al principio los valores distintos de cero.
Pero parece una solución demasiado compleja con tanto vector, además previamente habría que contar cuantos ceros contiene el vector original para determinar que tamaños han de tener los vectores temporales, aunque está el truco de concatenar los valores en cadenas String que podemos hacer crecer sin especificar un tamaño fijo.
Pero tiene que haber alguna forma más ingeniosa y eficiente de ordenar trabajando directamente sobre el vector.
A ver si conseguimos dar con la solución.
Un saludo.