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