Métodos de Ordenação

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

SCC-601 Introdução à Ciência da Computação II. Ordenação e Complexidade Parte 3. Lucas Antiqueira

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

Métodos de Ordenação Parte 4

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

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

Métodos de Ordenação Parte 3

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

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Métodos 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;

Algoritmos de ordenação Heapsort

Métodos de Busca Parte 1

Introdução Métodos de Busca Parte 1

Algoritmos de Ordenação: HeapSort

Heapsort é um método de ordenação cujo princípio de funcionamento é o mesmo utilizado para a ordenação por seleção.

- Métodos simples de busca - Métodos ingênuos de ordenação (introdução)

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Árvores. SCC-214 Projeto de Algoritmos. Thiago A. S. Pardo. Um nó após o outro, adjacentes Sem relações hierárquicas entre os nós, em geral

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

Análise de algoritmos

ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES

Estruturas de Dados 2

Banco de Dados. Métodos de Ordenação de Dados. Prof. Walteno Martins Parreira Jr

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

Análise de algoritmos

2. Ordenação por Seleção

Conteúdo. Busca Seqüencial. Busca Binária. Algoritmos de Ordenação e Busca e sua Análise de Complexidade. Alneu de Andrade Lopes Rosane Minghim

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

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

BCC202 - Estrutura de Dados I

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

Projeto e Análise de Algoritmos

Aula 28: Listas de Prioridades

Introdução à Computação II (Noturno) BCC Unesp Rio Claro/SP 2015 em PDF via Moodle: Escolha apenas 5 exercícios para entrega Exercício 01 (Pilhas)

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

Trabalho: Algoritmos de Busca e Ordenação. 1 Introdução. Prof. Bruno Emerson Gurgel Gomes IFRN - Câmpus Currais Novos. 31 de outubro de 2012

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

Ordenação Interna. Prof. Jonas Potros

Algoritmos e Estruturas de Dados 2006/2007

Filas de prioridade. Marcelo K. Albertini. 3 de Dezembro de 2013

Os métodos de ordenação que ordenam os elementos in situ podem ser classificados em três principais categorias:

5. Algoritmos de Ordenação

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

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

Listas de Prioridade. Fonte de consulta: Szwarcfiter, J.; Markezon, L. Estruturas de Dados e seus Algoritmos, 3a. ed. LTC.

Processamento Cosequencial: Ordenação Interna e Externa. Thiago A. S. Pardo Leandro C. Cintra M.C.F. de Oliveira Cristina D. A.

UNIVERSIDADE FEDERAL DO PIAUÍ COLÉGIO TÉCNICO DE TERESINA-TÉCNICO EM INFORMÁTICA DISCIPLINA: ESTRUTURA DE DADOS PROFESSOR: Valdemir Junior

Ordenação e Busca em Arquivos

UNIVERSIDADE DE SÃO PAULO ICMC SCC 202 Algoritmos e Estrutura de Dados I - 2º Semestre 2010 Profa. Sandra Maria Aluísio;

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

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

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

DAINF - Departamento de Informática

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

Prova 2 PMR2300 1o. semestre 2015 Prof. Thiago Martins

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

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

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

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

BCC202 - Estrutura de Dados I

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

Árvores binárias de busca

Algoritmos de Ordenação

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

Heap Sort. Algoritmos e Estruturas de Dados Verão Cátia Vaz 1

Centro de Informá-ca Universidade Federal de Pernambuco. Vinicius Cardoso Garcia 2011 Vinicius Cardoso Garcia

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

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

Carlos Eduardo Batista. Centro de Informática - UFPB

Heapsort ordenação por árvore de seleção

Ordenação: Heapsort. Algoritmos e Estruturas de Dados II

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Ordenação. Prof. Jonas Potros

INF 1007 Programação II

Métodos de Classificação

Extra- Algoritmos de Ordenação

SCC Capítulo 4 Métodos de Ordenação

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Algoritmos e Estrutura de Dados

Ordenação de Dados (III) HeapSort

Algoritmos de Ordenação

Linguagem C: Ordenação

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

Aplicações de listas e outras estruturas

Aula 13: Ordenação - Heapsort. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Métodos de Classificação

CONCEITO DE ÁRVORE CES-11. A raiz é o único nó que não possui ancestrais. As folhas são os nós sem filhos. Exemplos:

HeapSort Filas de Prioridade Heap. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Módulo 16 - Ordenação

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

Vectores: Algoritmos de Ordenação. Algoritmos e Estruturas de Dados 2009/2010

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

Análise de Algoritmos Estrutura de Dados II

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Transcrição:

Métodos de Ordenação Parte 3 SCC-601 Introdução à Ciência da Computação II Rosane Minghim 2010/2011 Baseado no material dos Professores Rudinei Goularte e Thiago Pardo 1

Ordenação por Seleção Idéia básica: os elementos são selecionados e dispostos em suas posições corretas Seleção direta (ou simples), ou classificação de deslocamento descendente, ou método do monte 2

Seleção Direta Método 1. Selecionar o elemento que apresenta o menor valor 2. Trocar o elemento de lugar com o primeiro elemento da seqüência, x[0] 3. Repetir as operações 1 e 2, envolvendo agora apenas os n-1 elementos restantes, depois os n-2 elementos, etc., até restar somente um elemento, o maior deles 3

Seleção Direta x = 44, 55, 12, 42, 94, 18, 06, 67 (vetor original) 44 55 12 42 94 18 06 67 passo 1 (06) 06 55 12 42 94 18 44 67 passo 2 (12) 06 12 55 42 94 18 44 67 passo 3 (18) 06 12 18 42 94 55 44 67 passo 4 (42) 06 12 18 42 94 55 44 67 passo 5 (44) 06 12 18 42 44 55 94 67 passo 6 (55) 06 12 18 42 44 55 94 67 passo 7 (67) 06 12 18 42 44 55 67 94 4

Seleção Direta No i-ésimo passo, o elemento com o menor valor entre x[i],..., x[n] é selecionado e trocado com x[i] Como resultado, após i passos, os elementos x[1],..., x[i] estão ordenados 5

Seleção Direta Exercício Implementar a Seleção Direta Calcular a complexidade 6

Seleção Direta void selecao(int x[], int n) { int i, j, menor, index; for (i = 0; i < n-1; i++) { menor = x[ i ]; index = i; for (j = i+1; j < n; j++) { if (x[ j ] < menor) { menor = x[ j ]; index = j; } } x[ index ] = x[ i ]; x[ i ] = menor; } } 7

Seleção Direta No primeiro passo ocorrem n - 1 comparações, no segundo passo n - 2, e assim por diante Logo, no total, tem-se (n - 1) + (n -2) +... + 1 = n * (n -1)/2 comparações: O(n 2 ) Não existe melhora se a entrada está completamente ordenada ou desordenada Exige pouco espaço É melhor que o Bubble-sort É útil apenas quando n é pequeno 8

Utiliza uma estrutura de dados - um heap para ordenar os elementos Atenção: a palavra heap é utilizada atualmente em algumas linguagens de programação para se referir ao espaço de armazenamento de lixo coletado 9

Um heap é um vetor que implementa (representa) uma árvore binária quase completa 0 16 0 1 2 3 4 5 6 7 8 9 16 14 10 8 7 9 3 2 4 1 1 2 14 10 3 4 5 6 8 7 9 3 2 4 1 7 8 9 10

Uma árvore binária de profundidade/nível d é uma árvore binária quase completa se: Cada folha estiver no nível d ou d 1 Para cada nó v da árvore com descendente direito no nível d, todos os descendentes esquerdos de v que forem folhas estiverem também no nível d 11

Exemplos de árvores binárias quase completas 12

Exemplos de árvores binárias que não são quase completas Por quê? 13

Um heap observa conceitos de ordem e de forma Ordem: o item de qualquer nó deve satisfazer uma relação de ordem com os itens dos nós filhos Heap máximo (ou descendente): pai >= filhos, sendo que a raiz é o maior elemento Propriedade de heap máximo Heap mínimo (ou heap ascendente): pai <= filhos, sendo que a raiz é o menor elemento Propriedade de heap mínimo Forma: a árvore binária tem seus nós-folha, no máximo, em dois níveis, sendo que as folhas devem estar o mais à esquerda possível 14

16 16 14 10 14 10 8 7 9 3 8 7 9 3 2 4 1 2 4 1 É um heap máximo Não é um heap máximo 15

Como acessar os elementos (pai e filhos de cada nó) no heap? 8 14 2 4 1 7 0 16 1 2 10 3 4 5 6 7 8 9 9 3 0 1 2 3 4 5 6 7 8 9 16 14 10 8 7 9 3 2 4 1 Filhos do nó k: filho esquerdo = 2k + 1 filho direito = 2k + 2 Pai do nó k: (k-1)/2 Folhas de n/2 em diante 16

Assume-se que: A raiz está sempre na posição 0 do vetor comprimento(vetor) indica o número de elementos do vetor tamanho_do_heap(vetor) indica o número de elementos no heap armazenado dentro do vetor Ou seja, embora A[1..comprimento(A)] contenha números válidos, nenhum elemento além de A[tamanho_do_heap(A)] é um elemento do heap, sendo que tamanho_do_heap(a)<=comprimento(a) 17

A idéia para ordenar usando um heap é: Construir um heap máximo Trocar a raiz o maior elemento com o elemento da última posição do vetor Diminuir o tamanho do heap em 1 Rearranjar o heap máximo, se necessário Repetir o processo n-1 vezes 18

: exemplo 1) Monta-se o heap com base no vetor desordenado 3) Troca-se a raiz com o último elemento (x[6]) e rearranja-se o heap 2) Troca-se a raiz (maior elemento) com o último elemento (x[7]) e rearranja-se o heap 19

O processo continua até todos os elementos terem sido incluídos no vetor de forma ordenada É necessário: Saber construir um heap a partir de um vetor qualquer Procedimento build_max_heap Saber como rearranjar o heap, i.e., manter a propriedade de heap máximo Procedimento max_heapify 20

Procedimento max_heapify: manutenação da propriedade de heap máximo Recebe como entrada um vetor A e um índice i Assume que as árvores binárias com raízes nos filhos esquerdo e direito de i são heap máximos, mas que A[i] pode ser menor que seus filhos, violando a propriedade de heap máximo A função do procedimento max_heapify é deixar A[i] escorregar para a posição correta, de tal forma que a subárvore com raiz em i torne-se um heap máximo 21

Exemplo Chamando a função max_heapify para um heap hipotético max_heapify(a,1) 22

0 16 1 2 14 10 0 16 3 4 5 6 8 7 9 3 1 2 4 10 3 4 5 6 14 7 9 3 0 16 2 4 1 7 8 9 2 8 1 1 2 14 10 7 8 9 3 4 5 6 4 7 9 3 2 8 1 7 8 9 23

Na realidade, trabalhando-se com o vetor A 0 1 2 3 4 5 6 7 8 9 16 4 10 14 7 9 3 2 8 1 Execução de max_heapify(a,1) 0 1 2 3 4 5 6 7 8 9 16 14 10 4 7 9 3 2 8 1 Execução recursiva de max_heapify(a,3) 0 1 2 3 4 5 6 7 8 9 16 14 10 8 7 9 3 2 4 1 24

Implementação e análise da sub-rotina max_heapify 25

Lembrete: as folhas do heap começam na posição n/2+1 Procedimento build_max_heap Percorre de forma ascendente os primeiros n/2 nós (que não são folhas) e executa o procedimento max_heapify A cada chamada do max_heapify para um nó, as duas árvores com raiz neste nó tornam-se heaps máximos Ao chamar o max_heapify para a raiz, o heap máximo completo é obtido 26

0 1 2 3 4 5 6 7 8 9 4 1 3 2 16 9 10 14 8 7 n/2=4 0 0 4 max_heapify(a,4) 4 1 2 1 3 1 2 1 3 2 16 3 4 5 6 9 10 2 16 3 4 5 6 9 10 14 8 7 7 8 9 14 8 7 7 8 9 27

0 4 1 2 1 3 max_heapify(a,3) 1 0 4 1 2 3 16 3 4 5 6 2 9 10 14 16 3 4 5 6 9 10 14 8 7 7 8 9 2 8 7 7 8 9 28

0 4 max_heapify(a,2) 0 4 1 2 1 3 1 2 1 10 14 16 3 4 5 6 9 10 16 3 4 5 6 14 9 3 2 8 7 2 8 7 7 8 9 7 8 9 29

0 0 4 1 2 1 10 max_heapify(a,1) 16 4 1 2 10 16 3 4 5 6 14 9 3 3 4 5 6 14 7 9 3 2 8 7 2 8 1 7 8 9 7 8 9 30

0 1 2 3 4 5 6 7 8 9 16 14 10 8 7 9 3 2 4 1 0 4 max_heapify(a,0) 0 16 1 2 16 10 1 2 14 10 3 4 5 6 14 7 9 3 3 4 5 6 8 7 9 3 2 8 1 2 7 8 9 4 1 7 8 9 31

Implementação e análise da sub-rotina build_max_heap 32

Retomando... Procedimento heap-sort 1. Construir um heap máximo (via build_max_heap) 2. Trocar a raiz o maior elemento com o elemento da última posição do vetor 3. Diminuir o tamanho do heap em 1 4. Rearranjar o heap máximo, se necessário (via max_heapify) 5. Repetir o processo n-1 vezes 33

Dado o vetor: 0 1 2 3 4 5 6 7 8 9 4 1 3 2 16 9 10 14 8 7 Chamar bulid_max_heap e obter: 0 1 2 3 4 5 6 7 8 9 16 14 10 8 7 9 3 2 4 1 Executar os passos de 2 a 4 n 1 vezes 34

16 14 1 10 14 3 10 8 10 8 9 8 7 9 3 4 7 9 3 4 7 1 3 2 4 1 2 1 2... 0 1 2 3 4 5 6 7 8 9 1 2 3 4 7 8 9 10 14 16 Vetor ordenado! 35

Implementação e análise da sub-rotina heap-sort 36

O método é O(n log(n)), sendo eficiente mesmo quando o vetor já está ordenado n-1 chamadas a max_heapify, de O(log(n)) build_max_heap é O(n) 37