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

Documentos relacionados
Classificação por Intercalação

Ordenação. Prof. Jonas Potros

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

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

BCC202 - Estrutura de Dados I

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

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

Algoritmo MergeSort. 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

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

Ordenação de Dados (IV) MergeSort

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

ALGORITMOS DE ORDENAÇÃO

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;

Métodos de Ordenação Parte 2

Estruturas de Dados 2

Algoritmos de Ordenação: Tempo Linear

Nem todos os problemas algorítmicos que podem ser resolvidos em princípio podem ser resolvidos na prática: os recursos computacionais requeridos

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

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

Extra- Algoritmos de Ordenação

Algoritmos de Ordenação: MergeSort

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

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

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

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

Classificação por Particionamento

Algoritmos de Ordenação

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

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

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

ALGORITMOS DE ORDENAÇÃO RECURSIVOS

Ordenação. Prof. Túlio A. M. Toffolo Prof. Marco Antonio M. Carvalho BCC402 Aula 04 Algoritmos e Programação Avançada

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

ORDENAÇÃO POR INTERCALAÇÃO

Classificação por Seleção - selection sort

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

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Ordenação por Intercalação Métodos de Ordenação Parte 4

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

Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia

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

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

Ordenação em Tempo Linear

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

Métodos de Classificação

Métodos de Classificação

MAC121 ALGORITMOS E ESTRUTURAS DE DADOS I 2O. SEMESTRE DE 2017

BCC202 - Estrutura de Dados I

BCC202 - Estrutura de Dados I

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

INF111 Programação II Aulas 11, 12, 13 Ordenação

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

Programação Estruturada

Algoritmos de Ordenação: QuickSort

Projeto e Análise de Algoritmos

Métodos de Ordenação Parte I

Filas Exemplo de Aplicação

6. Pesquisa e Ordenação

CIC 110 Análise e Projeto de Algoritmos I

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

Análise de Algoritmos Algoritmos de Ordenação

Métodos de Ordenação Parte 3

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

Linguagem C: Ordenação

Métodos de Ordenação Parte 4

USP - ICMC - SSC SSC o. Semestre Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Automação ]

Análise de Algoritmos

Estruturas de Dados 2

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

Algoritmos e Estruturas de Dados II. Trabalho Prático 3

Algoritmos e Estruturas de Dados II. Ordenação Externa II. Ordenação Externa. Ordenação Externa. Ordenação Externa

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

Limite assintótico para a ordenação, Ordenação em tempo linear

ORDENAÇÃO DE ARQUIVOS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Algoritmos de ordenação

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

ESTRUTURAS DE DADOS E ALGORITMOS ALGORITMOS DE ORDENAÇÃO EM TEMPO LINEAR

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

Bucketsort. CLRS sec 8.4. Algoritmos p. 1

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

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

Ordenação por Seleção Métodos de Ordenação Parte 3

QUESTÕES DE PROVAS ANTIGAS

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

CURSO BÁSICO DE PROGRAMAÇÃO AULA 16. Ordenação Revisão para a prova

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

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

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

Bubble Sort. Tempo total O(n 2 )

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

Algoritmos e Programação de Computadores Profs: Ronaldo Castro de Oliveira Anilton Joaquim da Silva

Análise e Complexidade de Algoritmos

Algoritmos de ordenação Ordenação rápida ( Quicksort )

Ordenação. Última alteração: 10 de Outubro de Transparências elaboradas por Fabiano C. Botelho, Leonardo Rocha, Leonardo Mata e Nivio Ziviani

Transcrição:

void subdivide (LISTA_ENC *pl, LISTA_ENC *pl1, LISTA_ENC *pl2) { int cont, k=1; for (cont=tam(*pl)/2;cont;cont--) { } ins(pl1,recup(*pl,1),k++); ret(pl,1); } for (k=1, cont=tam(*pl);cont;cont--) { ins(pl2,recup(*pl,1),k++); ret(pl,1); } 337

338 void intercala (LISTA_ENC *pl1, LISTA_ENC *pl2, LISTA_ENC *pl) { int k=1; while (*pl1&&*pl2) { if ((*pl1)->inf>(*pl2)->inf) { ins(pl,(*pl2)->inf,k++); ret(pl2, 1); } else { ins(pl,(*pl1)->inf,k++); ret(pl1, 1); } } while (*pl1) { ins(pl,(*pl1)->inf,k++); ret(pl1, 1); } while (*pl2) { ins(pl,(*pl2)->inf,k++); ret(pl2, 1); } }

339 Classificação por Intercalação Este é um bom exemplo de abordagem top down, ou de aplicação do princípio da divisão e conquista, associado à recursividade. A implementação que vimos é estável? Sim. Ao se observar o andamento do processo sobre a lista, nota-se que a intercalação só começa quando as sublistas tornam-se unitárias. Até lá, a posição relativa dos elementos não muda. Ou seja: atinge-se uma situação de n sublistas unitárias, cuja a concatenação é a lista original.

340 Classificação por Intercalação A intercalação começa juntando pares de elementos, a partir das listas unitárias. Ora, bem, no caso de um vetor, os elementos individuais já estão acessíveis. Logo, pode-se começar a ordenação com meio caminho andado (em relação às listas), intercalando trechos de um elemento, depois de dois, quatro e assim por diante. Cada trecho sob intercalação é dito cadeia ou cordão de intercalação. Veja o esquema a seguir, onde K é o comprimento da cadeia.

Classificação por Intercalação Exemplo: Ordenação de vetor por intercalação 1º passo K = 1 75 25 95 87 64 59 86 40 16 49 12 [0..0] e [1..1], [2..2] e [3..3], [4..4] e [5..5], [6..6] e [7..7], [8..8] e [9..9] 2º passo K = 2 25 75 87 95 59 64 40 86 16 49 12 [0..1] e [2..3], [4..5] e [6..7], [8..9] e [10..10] 3º passo K = 4 25 75 87 95 40 59 64 86 12 16 49 [0..3] e [4..7] 4º passo K = 8 25 40 59 64 75 86 87 95 12 16 49 [0..7] e [8..10] 341 12 16 25 40 49 59 64 75 86 87 95

Classificação por Intercalação Outro exemplo: Vetor = {O R D E N A R A} AAD E N O R R D E O R A A N R O R D E A N A R O R D E N A R A 342

Classificação por Intercalação Logo, o problema divide-se, então, em duas partes: i. delimitar as partições do vetor que devem ser intercaladas; ii. intercalar as partições. 343

344 Classificação por Intercalação Para estabelecer as cadeias a intercalar, começa-se com tamanho k = 1. Na primeira passagem, formam-se cadeias de tamanho 2, depois de tamanho 4, 8, etc. Assim na primeira passagem, são intercaladas as partições V[0..0] e V[1..1], V[2..2] e V[3..3], V[4..4] e V[5..5] etc. Na segunda V[0..1] e V[2..3], V[4..5] e V[6..7], etc. Na terceira, V[0..3] e V[4..7], V[8..11] e V[12..15], etc. A regra geral, na passagem i, em que o tamanho da cadeia é k = 2 i-1, são intercalados os trechos V[j..j+k-1] e V[j+k..j+2*k-1].

Classificação por Intercalação O problema da intercalação tem solução simples baseada no processo conhecido como balance line: percorre-se as duas cadeias a intercalar, usando um cursor para cada uma, copiando para um vetor-resposta sempre o menor elemento dentre os iniciais, avançando-se o cursor apenas da cadeia fornecedora. Ao se esgotar uma das cadeias, a outra é percorrida até o fim, preenchendo-se o vetor-resposta. 345

346 Classificação por Intercalação Uma questão adicional que se coloca é: Como salvar o resultado a cada passagem? Só o poderíamos fazer sobre o próprio vetor se fosse adotada uma solução recursiva, como no caso da lista. Mas, isto de fato replicaria muitas vezes a área original, pelo salvamento cumulativo de versões parcialmente ordenadas. Torna-se melhor intercalar um vetor auxiliar, contendo uma cópia do vetor a ordenar, colocando o resultado no vetor original (vetor-resposta).

Classificação por Intercalação Com base no que foi discutido, codifique uma função que receba um vetor (de inteiros) e o número de elementos no mesmo e através do método merge sort ordene de forma crescente os elementos do vetor. 347

void merge_sort (int *v, int n) { int *v_aux, tam_cadeia=1, j, i; if (!(v_aux=(int *)malloc(n*sizeof(int)))) exit(1); while (tam_cadeia<n) { for (i=0; i<n; v_aux[i]=v[i++]); j=0; while (j<n-tam_cadeia) } 348 } { intercala (v, v_aux, j, j+tam_cadeia-1, j+tam_cadeia, ((j+2*tam_cadeia-1)<n)? (j+2*tam_cadeia-1):(n-1)); j=j+2*tam_cadeia-1<n?j+2*tam_cadeia:n; } tam_cadeia*=2;

void intercala (int *v, int *v_aux, int limesqesq, int limesqdir, int limdiresq, int limdirdir) { int deve_continuar=1, esq_menor, IND=limesqesq; while (deve_continuar) { esq_menor=v_aux[limesqesq]<v_aux[limdiresq]; v[ind++]=esq_menor?v_aux[limesqesq++]: v_aux[limdiresq++]; deve_continuar=limesqesq<=limesqdir&& limdiresq<=limdirdir; } while (limesqesq<=limesqdir) v[ind++]=v_aux[limesqesq++]; while (limdiresq<=limdirdir) v[ind++]=v_aux[limdiresq++]; } 349

350 Classificação por Intercalação Quanto à complexidade do algoritmo apresentado nos slides anteriores, em uma análise superficial, pode ser determinada se considerarmos o seguinte: tam_cadeia, atualizada por duplicações sucessivas, assume valores do conjunto [1,2,4,8,16... n/2.0 ], sendo a repetição principal controlada pela condição tam_cadeia <= n/2, o que a qualifica como O (log n). Em cada passagem, cada elemento do vetor é copiado uma vez e intercalando uma vez (na função intercala).

Classificação por Intercalação O enquanto intermediário, i.e, o segundo enquanto do algoritmo principal, apenas distribui o processamento sobre os sucessivos subvetores. Isto acarreta no máximo 2n movimentos de dados em cada fase. Logo, o procedimento todo é da ordem de 2n log n, ou seja, O (n log n). Como uma análise mais profunda fugiria do escopo desta disciplina, ficaremos apenas neste nível de analise. 351

352 Métodos de Ordenação que utilizam o Princípio de Distribuição Exemplo: considere o problema de ordenar um baralho com 52 cartas não ordenadas. Suponha que ordenar o baralho implica em colocar as cartas de acordo com a ordem A < 2 < 3 <... < 10 < J < Q < K < < < < Para ordenar por distribuição, basta seguir os passos abaixo: 1. Distribuir as cartas em 13 montes, colocando em cada monte todos os ases, todos os dois, todos os três,..., todos os reis. 2. Colete os montes na ordem acima (as no fundo, depois os dois, etc.), até o rei ficar no topo.

Métodos de Ordenação que utilizam o Princípio de Distribuição 3. Distribua novamente as cartas abertas em 4 montes, colocando em cada monte todas as cartas de paus, todas as cartas de ouros, todas as cartas de copas e todas as cartas de espadas. 4. Colete os montes na ordem indicada (paus, ouros, copas e espadas). Métodos baseados no princípio de distribuição são também conhecidos como ordenação digital, radixsort ou bucketsort. Neste caso não existe comparação entre chaves. 353

Métodos de Ordenação que utilizam o Princípio de Distribuição Outro exemplo: As antigas classificadoras de cartões perfurados também utilizam o princípio da distribuição para ordenar uma massa de cartões. Dificuldades de implementar este método: Problema de lidar com cada monte. Se para cada monte nós reservarmos uma área, então a demanda por memória extra pode se tornar proibitiva. 354