.
A figura abaixo mostra exatamente oque é feito pelo Merge Sort:
A parte azul da imagem representa a função de intercalação, que faz a divisão do vetor. O vetor é dividido até que fique em várias partes com um elemento. Isso por que um vetor de um elemento já está ordenado.
Na parte verde é feita a união desses "subvetores" ordenando-os durante a sua junção, essa é a ilustração da função merge.
Implementação do merge sort em C:
#include <stdio.h>
void merge(int vet[], int tamanho) {
int *tmp, meio, i, j, k;
//alocando memória pro tamanho do vetor
//exemplo: vetor tamanho 5 int = 4 bytes -> 5*4 = 20bytes alocados.
tmp = (int*) malloc(tamanho * sizeof(int));
//tmp armazena endereço inicial do espaço alocado
//se o tmp for vazio sair da função e retornar 1 (falha)
if (tmp == NULL) {
exit(1);
}
meio = tamanho / 2; //meio do vetor
i = 0;
j = meio;
k = 0;
while (i < meio && j < tamanho) {
if (vet[i] <= vet[j]) {
tmp[k] = vet[i++];
}
else {
tmp[k] = vet[j++];
}
++k;
}
if (i == meio) {
while (j < tamanho) {
tmp[k++] = vet[j++];
}
}
else {
while (i < meio) {
tmp[k++] = vet[i++];
}
}
for (i = 0; i < tamanho; ++i) {
vet[i] = tmp[i];
}
free(tmp); //liberar espaço alocado
}
void mergeSort(int vet[], int tamanho) {
int meio;
if (tamanho > 1) {
meio = tamanho / 2;
mergeSort(vet, meio);
mergeSort(vet + meio, tamanho - meio);
merge(vet, tamanho);
}
}
int main(int argc, char *argv[])
{
int v[10] = {9,8,6,1,5,2,6,4,0,6}, i;
mergeSort(v, 10); //chamada a função merge
//mostrar vetor ordenado
printf("\nVetor ordenado: ");
for(i=0;i<10;i++)
printf("%d, ", v[i]);
}

Nenhum comentário:
Postar um comentário