public void merge() {
	// Crear un array temporario para trabajar.
	int[] temp = new int[elementos];
	// Llamar al metodo recursivo.
	recMergeSort(temp, 0, elementos - 1);
}

private void recMergeSort(int[] temp, int izquerda, int derecha) {
	if (izquerda != derecha) {
		int medio = (izquerda + derecha) / 2;
		// Trabajar con los valores en el lado izquerdo.
		recMergeSort(temp, izquerda, medio);
		// Trabajar con los valores en el lado derecha.
		recMergeSort(temp, medio + 1, derecha);
		// Unir los valores.
		merge(temp, izquerda, medio + 1, derecha);
	}
}

private void merge(int[] temp, int prevIzquerda, int prevMedio, int derecha) {
	int j = 0;
	int izquerda = prevIzquerda;
	int medio = prevMedio - 1;
	int masDerecha = derecha - izquerda + 1;

	while (prevIzquerda <= medio && prevMedio <= derecha) {
		// Poner un valor en el array temporario.
		if (array[prevIzquerda] < array[prevMedio]) {
			temp[j++] = array[prevIzquerda++];
		}
		else {
			temp[j++] = array[prevMedio++];
		}
	}

	while (prevIzquerda <= medio) {
		// Mientras que el valor previos de izquerda es menor que el medio correr los valores.
		temp[j++] = array[prevIzquerda++];
	}

	while (prevMedio <= derecha) {
		// Mientras que el valor previos de derecha es menor que el medio correr los valores.
		temp[j++] = array[prevMedio++];
	}

	for (j = 0; j < masDerecha; j++) {
		// Copiar los valores al array real.
		array[izquerda + j] = temp[j];
	}
}