Non ho guardato l'algoritmo e non l'ho nemmeno analizzato.
Una cosa: in ogni if, ci deve essere una espressione che può essere vera o falsa.
Nel tuo caso:
if (cambia = 0)
questa espressione il compilatore la vede intanto come un'assegnazione, e poi una espressione falsa perché è uguale a zero. E sarà sempre falsa, il blocco di codice interno non verrà mai eseguito
Quello che vorresti fare tu è:
if (cambia == 0)
Capita la differenza? "=" è assegnazione, "==" è confronto.
Stessa cosa per tutti gli altri if