.
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