82 lines
1.8 KiB
Java
82 lines
1.8 KiB
Java
/**
|
|
* Algoritmo de ordenacao Mergesort
|
|
* @author Max do Val Machado
|
|
* @version 3 08/2020
|
|
*/
|
|
class Mergesort extends Geracao {
|
|
|
|
/**
|
|
* Construtor.
|
|
*/
|
|
public Mergesort(){
|
|
super();
|
|
}
|
|
|
|
|
|
/**
|
|
* Construtor.
|
|
* @param int tamanho do array de numeros inteiros.
|
|
*/
|
|
public Mergesort(int tamanho){
|
|
super(tamanho);
|
|
}
|
|
|
|
|
|
/**
|
|
* Algoritmo de ordenacao Mergesort.
|
|
*/
|
|
@Override
|
|
public void sort() {
|
|
mergesort(0, n-1);
|
|
}
|
|
|
|
/**
|
|
* Algoritmo de ordenacao Mergesort.
|
|
* @param int esq inicio do array a ser ordenado
|
|
* @param int dir fim do array a ser ordenado
|
|
*/
|
|
private void mergesort(int esq, int dir) {
|
|
if (esq < dir){
|
|
int meio = (esq + dir) / 2;
|
|
mergesort(esq, meio);
|
|
mergesort(meio + 1, dir);
|
|
intercalar(esq, meio, dir);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Algoritmo que intercala os elementos entre as posicoes esq e dir
|
|
* @param int esq inicio do array a ser ordenado
|
|
* @param int meio posicao do meio do array a ser ordenado
|
|
* @param int dir fim do array a ser ordenado
|
|
*/
|
|
public void intercalar(int esq, int meio, int dir){
|
|
int n1, n2, i, j, k;
|
|
|
|
//Definir tamanho dos dois subarrays
|
|
n1 = meio-esq+1;
|
|
n2 = dir - meio;
|
|
|
|
int[] a1 = new int[n1+1];
|
|
int[] a2 = new int[n2+1];
|
|
|
|
//Inicializar primeiro subarray
|
|
for(i = 0; i < n1; i++){
|
|
a1[i] = array[esq+i];
|
|
}
|
|
|
|
//Inicializar segundo subarray
|
|
for(j = 0; j < n2; j++){
|
|
a2[j] = array[meio+j+1];
|
|
}
|
|
|
|
//Sentinela no final dos dois arrays
|
|
a1[i] = a2[j] = 0x7FFFFFFF;
|
|
|
|
//Intercalacao propriamente dita
|
|
for(i = j = 0, k = esq; k <= dir; k++){
|
|
array[k] = (a1[i] <= a2[j]) ? a1[i++] : a2[j++];
|
|
}
|
|
}
|
|
}
|