I vari break che hai piazzato fanno uscire solo dal for più interno; il ciclo sulle x continua ad andare, individua nuovamente il numero inserito e scambia di nuovo, effettivamente annullando il primo spostamento. Puoi risolvere con un flag controllato nella condizione del for esterno, o più banalmente con un return.
Per inciso, ci sono un po' di altri errori su quelle condizioni, in particolare non consideri che sui bordi vai a sforare l'array del campo (ad esempio, se il ciclo è arrivato ad (x,y)=(3,3), i vari if vanno a controllare gli elementi (3,4) e (4,3), sforando dai bordi dell'array).