Una cosa, solo he mirado un poco por encima tu codigo (ni lo he compilado ni he intentado averiguar que hace), pero me parece que tienes dos bucles 'for' y desde el segundo incrementas el contador del primero
  
Código:
 for(int i = 0; i < tamanio - 1; i++) {
    ...
    for(int indice = i + 1; indice < tamanio; i++) {//esta es la 58
        ...
    }
}
  "...el problema no debería suceder según yo..."
Ok, segun 'yo' ¿cuando se detiene el segundo bucle si no incrementas la variable 'indice' que hace de fin de carrera?  
Saludos
vosk