Algoritmo MergeSort. Estrutura de Dados II Prof Jairo Francisco de Souza

Documentos relacionados
Intercalação de vários arquivos. Estrutura de Dados II Prof Jairo Francisco de Souza

ALGORITMOS AVANÇADOS. UNIDADE III Algoritmo de Ordenação por Intercalação (Mergesort) Luiz Leão

ALGORITMOS DE ORDENAÇÃO

Análise e Complexidade de Algoritmos

Arquivos Seqüenciais: Intercalação

BCC202 - Estrutura de Dados I

void subdivide (LISTA_ENC *pl, LISTA_ENC *pl1, LISTA_ENC *pl2) { int cont, k=1; for (cont=tam(*pl)/2;cont;cont--) {

Classificação por Intercalação

Ordenação Externa. Ordenação Externa. Ordenação Externa. Ordenação Externa

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

Classificação Externa: Intercalação de Partições Classificadas

Algoritmos de Ordenação: MergeSort

Algoritmos de Ordenação

Métodos de Ordenação: Selection, Insertion, Bubble, Merge (Sort)

Algoritmos de Ordenação. Profº Carlos Alberto T. Batista

Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet

QuickSort. Estrutura de Dados II Jairo Francisco de Souza

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

Métodos de ordenação. Bubble sort:

Solução de Recorrências

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

ORDENAÇÃO EXTERNA DE ARQUIVOS: GERAÇÃO DE PARTIÇÕES CLASSIFICADAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Universidade Federal do ABC Avaliação Disciplina Turma Professor Data Instruções para a prova (leia antes de começar): SelectionSort selectonsortrec

heapsort (int *x, int n) { int i, e, s, f, aux; /*fase de pré-processamento - cria heap inicial*/ for (i=1; i<n; i++) { e = x[i]; s = i; f = (s-1)/2;

Projeto e Análise de Algoritmos

Ordenação em Memória Primária Estrutura de Dados II

MÉTODOS DE CLASSIFICAÇÃO EM MEMÓRIA PRIMÁRIA. George Gomes Cabral

Estruturas de Dados Algoritmos de Ordenação

Aula 19: Métodos eficientes de ordenação

Ordenação de Dados (IV) MergeSort

Capacitação em Linguagem C Parte 2

Classificação Externa: Geração de Partições Classificadas

Estruturas de Dados 2

Algoritmos de Ordenação: QuickSort

Classificação Externa: Geração de Partições Classificadas

Métodos de Ordenação Parte 3

Ordenação Externa. Profa. Graça Nunes

Algoritmos de Ordenação em LISP

Pedro Ribeiro 2014/2015

1. O que é a eficiência assintótica de um algoritmo. Explique com suas palavras.

AED2 - Aula 11 Problema da separação e quicksort

Aula 12 Métodos de Classificação: - Classificação por Inserção Direta - Classificação por Seleção Direta

Estrutura de Dados. Algoritmos de Ordenação. Prof. Othon M. N. Batista Mestre em Informática

Algoritmos de ordenação: Bucketsort, Radixsort e Seleção

Carlos Eduardo Batista. Centro de Informática - UFPB

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

Métodos de Ordenação Parte 4

Ordenação e Pesquisa

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

BUSCA EM ARRAYS. Prof. André Backes. Ato de procurar por um elemento em um conjunto de dados

CURSO DE ESTRUTURA DE DADOS MÓDULO: ALGORITMOS DE ORDENAÇÃO E PESQUISA PROFESSORA: DANIELA ELOISE FLÔR COLABORADORA: MARIA CAROLINA SILA VANUCHI

Algoritmos de Ordenação. Cota inferior. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

Edital de Seleção 023/2018 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Algoritmos de Ordenação

Análise e Complexidade de Algoritmos

Algoritmos de Ordenação

Algoritmos de Ordenação: Tempo Linear

Memória secundária. Memória secundária

Métodos de Ordenação Parte 2

ORDENAÇÃO POR INTERCALAÇÃO

Operações Coseqüenciais. Processamento Coseqüencial. Modelo para implementação de processos coseqüenciais

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI2

Classificação Externa: Intercalação de Partições Classificadas

Métodos de Classificação

5. Algoritmos de Ordenação

Mergesort. Aula 04. Algoritmo Mergesort. Divisão e Conquista. Divisão e Conquista- MergeSort

Algoritmos e Estrutura de Dados. Algoritmos Prof. Tiago A. E. Ferreira

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

Quicksort. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

MÉTODOS DE ORDENAÇÃO. Introdução à Programação SI1

5. Análise de Complexidade de Algoritmos. João Pascoal Faria (versão original) Ana Paula Rocha (versão 2003/2004) Luís Paulo Reis (versão 2005/2006)

Projeto e Análise de Algoritmos

Algoritmos e Estruturas de Dados LEE 2013/2014. popular devido à facilidade de implementação e eficiência

Métodos de Ordenação

Ordenação em Tempo Linear

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

Programação de Computadores Ordenação de Arranjos

Análise empírica de algoritmos de ordenação

BCC202 - Estrutura de Dados I

CIC 110 Análise e Projeto de Algoritmos I

Classificação e Pesquisa Aula 6 Métodos de Ordenação: ShellSort e QuickSort. Prof. Esp. Pedro Luís Antonelli Anhanguera Educacional

Algoritmos de ordenação Quicksort

Filas de prioridade. Marcelo K. Albertini. 27 de Novembro de 2014

Métodos de Ordenação Parte I

Ordenação. Prof. Jonas Potros

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO POR COMPARAÇÃO - II

Divisão-e-Conquista ( ) CAL ( ) MIEIC/FEUP. ./rr (1) Técnicas de Concepção de Algoritmos

Quick Sort. Considerações Sobre Algoritmos de Ordenação. Estagiário PAE: Jesimar da S. Arantes Professor: Claudio Quick F. M.

O Problema da Ordenação Métodos de Ordenação Parte 1

6. Pesquisa e Ordenação

Busca em Memória Primária Estrutura de Dados II

Busca em Memória Primária Estrutura de Dados II

Ordenação de Dados. Ordenação de Dados

Análise e Síntese de Algoritmos. Revisão CLRS, Cap. 7-10

Transcrição:

Algoritmo MergeSort Estrutura de Dados II Prof Jairo Francisco de Souza

Intercalação Generalidades Intercalação é o processo através do qual diversos arquivos seqüenciais classifcados por um mesmo critério são mesclados gerando um único arquivo seqüencial Algoritmo Básico De cada um dos arquivos a intercalar basta ter em memória um registro. Considera-se cada arquivo como uma pilha, e o registro em memória seu topo Em cada iteração do algoritmo e leitura dos registros, o topo da pilha com menor chave é gravado, e substituído pelo seu sucessor. Pilhas vazias têm topo igual a high value O algoritmo termina quando todos os topos da pilha tiverem high value

Intercalação Outra forma de intercalação é mesclar dois vetores (ordenados previamente) O resultado é um vetor ordenado, com os elementos dos vetores usados na mesclagem Vetor 1 11 33 55 55 77 99 99 Vetor 2 22 44 77 88 Vetor_Resultado 11 22 33 44 55 55 77 77 88 99 99

Intercalação Inicialmente, para que aconteça a intercalação (ou merge), os elementos dos dois vetores devem ser copiados para apenas um vetor Para execução do algoritmo de intercalação, o índice de início do segundo vetor e o tamanho do novo vetor devem ser encontrados Vetor 1 União dos Vetores 11 33 55 55 77 99 99 Vetor 2 22 44 77 88 Inicio_Vet_2 Inicio Fim 11 33 55 55 77 99 99 22 44 77 88 Intercalação 11 22 33 44 55 55 77 77 88 99 99

Intercalação A intercalação deve ser usada também quando há necessidade de unir dados de dois arquivos de dados Desta maneira, os dados poderiam ser acessados por meio de suas estruturas Através de comandos de manipulação de arquivos, os dados entre os arquivos poderiam ser intercalados, gerando um novo arquivo de dados Neste caso, o desenvolvedor deve se preocupar principalmente com a coincidência de chaves primárias, e realizar o tratamento das transações problemáticas

Algoritmo de Intercalação intercala (inteiro inicio_vet, inteiro inicio_vet_2, inteiro fim_vet, inteiro vetor[]) { inteiro indice_inicio, indice_inicio_vet_2, indice_aux; inteiro *vetor_aux; vetor_aux = (inteiro *) aloca_memoria (fim_vet * sizeof (inteiro)); indice_inicio = inicio_vet; indice_inicio_vet_2 = inicio_vet_2; indice_aux = 0; Enquanto (indice_inicio < inicio_vet_2 e indice_inicio_vet_2 < fim_vet) { Se (vetor[indice_inicio] <= vetor[indice_inicio_vet_2]) { vetor_aux [indice_aux] = vetor[indice_inicio]; indice_aux = indice_aux + 1; indice_inicio = indice_inicio + 1; senão { vetor_aux [indice_aux] = vetor[indice_inicio_vet_2]; indice_aux = indice_aux + 1; indice_inicio_vet_2 = indice_inicio_vet_2 + 1; Enquanto (indice_inicio < inicio_vet_2) { vetor_aux [indice_aux] = vetor[indice_inicio]; indice_aux = indice_aux + 1; indice_inicio = indice_inicio + 1; Enquanto (indice_inicio_vet_2 < fim_vet) { vetor_aux [indice_aux] = vetor[indice_inicio_vet_2]; indice_aux = indice_aux + 1; indice_inicio_vet_2 = indice_inicio_vet_2 + 1; Para (indice_inicio = inicio_vet; indice_inicio < fim_vet; indice_inicio++) { vetor[indice_inicio] = vetor_aux [indice_inicio - inicio_vet]; liberar_memoria (vetor_aux);

Intercalação usada para ordenação Algoritmo MergeSort utiliza a idéia de intercalação para ordenar registros. Algoritmo criado por von Neumann Complexidade O(NlogN) no caso médio e pior No pior caso é mais rápido do que o QuickSort Exemplo: Ordenar 10000 chaves: Algoritmos de O(N 2 ): 100.000.000 comparações MergeSort: 40.000 comparações

MergeSort A idéia central é unir dois arrays que já estejam ordenados. Ou seja, unir dois arrays A e B já ordenados e criar um terceiro array C que contenha os elementos de A e B já ordenados na ordem correta. O foco inicial é no processo de junção dos arrays e posteriormente vamos trabalhar o processo de ordenação

Cenário Considere que temos dois arrays já ordenados A e B que não precisam ser do mesmo tamanho onde A possui 4 elementos e B possui 6 elementos. Eles serão unidos para a criação de um array C com 10 elementos ao final do processo de união

Cenário A C 23 47 81 95 23 < 39? 47 < 55? Não há elementos em B 7 14 23 39 47 55 62 74 81 95 23 < 7? 23 < 14? 47 < 39? 81 < 55? 81 < 62? 81 < 74? B 7 14 39 55 62 74

Ordenação A idéia do método MergeSort é dividir um array ao meio, ordenar cada metade e depois unir estas duas metades novamente formando o array original, porém ordenado. Como seria feita essa divisão e ordenação para que as metades possam ser unidas? RECURSIVIDADE!

Ordenação

O algoritmo divide a sequência original em pares de dados, classifcando e intercalando os elementos das partições Três passos são fundamentais para a execução do mergesort: Dividir: Dividir os dados em subsequências pequenas; Conquistar: Classifcar as duas metades recursivamente aplicando o mergesort; Combinar: Juntar as duas metades em um único conjunto já classifcado

Dividir para conquistar O algoritmo é executado de forma recursiva Primeiro ordenar a primeira metade, em seguida a segunda metade mergesort(inteiro *vetor,inteiro inicio,inteiro fim) { inteiro meio;

Considere o vetor abaixo: 26 69 25 53 59 27 41 0 33 16 35 43

26 69 25 53 59 27 41 0 33 16 35 43

26 69 25 53 59 27 26 69 25 41 0 33 16 35 43

26 69 25 53 59 27 41 0 33 16 35 43

25 53 59 27 41 0 33 16 35 43 26 69

53 59 27 41 0 33 16 35 43 26 69 25

53 59 27 41 0 33 16 35 43 26 69 25

25 26 69 53 59 27 41 0 33 16 35 43

25 26 69 53 59 27 41 0 33 16 35 43

25 26 69 53 59 27 41 0 33 16 35 43

25 26 69 53 59 27 41 0 33 16 35 43

41 0 33 16 35 43 25 26 69 25 26 69 27 53 59

41 0 33 16 35 43 25 26 69 27 53 59

41 0 33 16 35 43 25 26 69 53 59 27

41 0 33 16 35 43 25 26 69 53 59 27

41 0 33 16 35 43 25 26 69 27 53 59

41 0 33 16 35 43 25 26 69 27 53 59

41 0 33 16 35 43 25 26 69 27 53 59

41 0 33 16 35 43 25 26 69 27 53 59

25 26 69 27 53 59 41 0 33 16 35 43

25 26 69 27 53 59 41 0 33 16 35 43

25 26 69 27 53 59 41 0 33 16 35 43

25 26 27 69 53 59 41 0 33 16 35 43

25 26 27 53 69 59 41 0 33 16 35 43

25 26 27 53 69 59 41 0 33 16 35 43

25 26 27 53 59 69 41 0 33 16 35 43

25 26 27 53 59 69 41 0 33 16 35 43

25 26 27 53 59 69 41 0 33 16 35 43

25 26 27 53 59 69 16 35 43 41 0 33

25 26 27 53 59 69 16 35 43 41 0 33

25 26 27 53 59 69 16 35 43 33 41 0

25 26 27 53 59 69 16 35 43 33 41 0

25 26 27 53 59 69 16 35 43 0 41 33

25 26 27 53 59 69 16 35 43 0 41 33

25 26 27 53 59 69 16 35 43 0 41 33

25 26 27 53 59 69 16 35 43 41 0 33

25 26 27 53 59 69 16 35 43 0 33 41

25 26 27 53 59 69 0 33 41 43 16 35

25 26 27 53 59 69 0 33 41 43 16 35

25 26 27 53 59 69 0 33 41 43 16 35

25 26 27 53 59 69 0 33 41 43 16 35

25 26 27 53 59 69 0 33 41 16 35 43

25 26 27 53 59 69 0 33 41 16 35 43

25 26 27 53 59 69 0 33 41 16 35 43

25 26 27 53 59 69 0 33 41 16 35 43

25 26 27 53 59 69 0 33 41 16 35 43

25 26 27 53 59 69 0 33 41 16 35 43

25 26 27 53 59 69 0 16 33 41 35 43

25 26 27 53 59 69 0 16 33 41 35 43

25 26 27 53 59 69 0 16 33 35 41 43

25 26 27 53 59 69 0 16 33 35 41 43

25 26 27 53 59 69 0 16 33 35 41 43

0 25 26 27 53 59 69 16 33 35 41 43

0 16 25 26 27 53 59 69 33 35 41 43

0 16 25 26 27 53 59 69 33 35 41 43

0 16 25 26 27 53 59 69 33 35 41 43

0 16 25 26 27 53 59 69 33 35 41 43

0 16 25 26 27 33 53 59 69 35 41 43

0 16 25 26 27 33 35 53 59 69 41 43

0 16 25 26 27 33 35 41 53 59 69 43

0 16 25 26 27 33 35 41 43 53 59 69

0 16 25 26 27 33 35 41 43 53 59 69

0 16 25 26 27 33 35 41 43 53 59 69

Vetor Ordenado: 0 16 25 26 27 33 35 41 43 53 59 69

Implementação do algoritmo MergeSort: principal { inteiro vetor[] = {7, 6, 5, 4, 8, 22, 3, 55, 7, 99, 11, 3, 1, 88; inteiro tamanho; inteiro indice; //Pode-se usar a função sizeof() tamanho tamanho_vetor / tamanho_de_um_inteiro; mergesort(vetor, 0, tamanho);

Implementação do algoritmo MergeSort: mergesort(inteiro *vetor,inteiro inicio,inteiro fim) { inteiro meio; meio (inicio + fim) / 2;

Implementação do algoritmo MergeSort: intercala(inteiro *vetor, inteiro inicio, inteiro meio, inteiro fim) { inteiro indice_inicio; inteiro indice_meio; inteiro indice_aux; inteiro *vetor_aux; indice_inicio inicio; indice_meio meio+1; indice_aux 0; vetor_aux alocacao_memoria(vetor); //Continua no slide posterior

Implementação do algoritmo MergeSort: enquanto(indice_inicio < meio+1 ou indice_meio < fim+1) { se (indice_inicio = meio+1) { vetor_aux[indice_aux] vetor[indice_meio]; indice_meio indice_meio + 1; indice_aux indice_aux + 1; senao se (indice_meio = fim+1) { vetor_aux[indice_aux] vetor[indice_inicio]; indice_inicio indice_inicio + 1; indice_aux indice_aux + 1; senao se (vetor[indice_inicio] <= vetor[indice_meio]) { vetor_aux[indice_aux] vetor[indice_inicio]; indice_inicio indice_inicio + 1; indice_aux indice_aux + 1; senao { vetor_aux[indice_aux] vetor[indice_meio]; indice_meio indice_meio + 1; indice_aux indice_aux + 1; //Continua no slide posterior

Implementação do algoritmo MergeSort: // copia vetor intercalado para o vetor original para(indice_inicio = inicio;indice_inicio <= fim;indice_inicio=indice_inicio+1) vetor[indice_inicio] vetor_aux[indice_inicio-inicio]; libera_memoria(vetor_aux);

Estudo da estabilidade O algoritmo é considerado estável, pois não há a possibilidade de elementos iguais mudar de posição no processo de ordenação A fase de divisão do algoritmo não altera a posição de nenhuma chave Ordenação é feita pelo algoritmo de intercalação A intercalação é feita verificando, sequencialmente, os elementos de acordo com sua posição no array Dessa forma, elementos com mesma chave não terão a sua posição relativa alterada