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

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

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

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

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

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;

ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES

Métodos de Ordenação Parte I

Métodos de Ordenação

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

Aula 28: Listas de Prioridades

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

Métodos de Ordenação

Filas de Prioridade & Heaps

Extra- Algoritmos de Ordenação

INF 1010 Estruturas de Dados Avançadas

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

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

Árvores Auto-ajustadas

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

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

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

Projeto e Análise de Algoritmos

INF 1010 Estruturas de Dados Avançadas

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

Algoritmos e Estrutura de dados II. Fila de Prioridade e Heaps

void ins_ele (ARV_BIN_BUSCA *arv, int v) { if (!(*arv)) maketree(arv, v); else if (v<info(*arv)) /* if (v<(*arv)->info) */ ins_ele(&((*arv)->left),

2. Ordenação por Seleção

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

Métodos de Ordenação Parte 4

MÉTODOS DE ORDENAÇÃO DE DADOS EM MEMÓRIA PRIMÁRIA. Material da Prof. Ana Eliza

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

Filas de Prioridade. Uma fila de prioridade pode ser vista como uma generalização das filas com as seguintes duas operações:

Métodos de Busca Parte 1

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

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

Ordenação Interna. Prof. Jonas Potros

Algoritmos de Ordenação: HeapSort

Ordenação. Prof. Jonas Potros

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

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Algoritmos e Estruturas de Dados 2006/2007

Linguagem C: Algoritmos de Ordenação

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

Á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

CES-11. Algoritmos e Estruturas de Dados. Representação. A estrutura heap. Heap é uma árvore binária com duas propriedades:

Algoritmos e Estruturas de Dados I1 Prof. Eduardo 1

3. Conteúdo de um vértice v é conteúdo dos filhos de v.

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

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

ALGORITMOS DE ORDENAÇÃO

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

Aplicações de listas e outras estruturas

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

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

Ordenação de Dados (III) HeapSort

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

BCC202 - Estrutura de Dados I

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

{ = == NULL) = == NULL)

Estruturas de Dados Estruturas de Dados Fundamentais

Métodos de Ordenação Parte 3

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

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

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

BCC202 - Estrutura de Dados I

Aplicações de listas Outras estruturas

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

Métodos de Classificação

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

Ordenação em Tempo Linear. Leitura: Cormen Capítulo 8

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

Introdução Métodos de Busca Parte 1

Ordenação e Busca em Arquivos

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

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

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

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

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

ÁRVORE BINÁRIA DE BUSCA

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

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

Lista de Prioridades. Estrutura de Dados II Prof. Erinaldo

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

UNIVERSIDADE DA BEIRA INTERIOR

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

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

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

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

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

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

Algoritmos de ordenação: Inserção e Shellsort

Estruturas de Dados. Filas em que a prioridade de remoção não é cronológica. Maior prioridade não é do elemento que ingressou primeiro

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

Ordenação. Última alteração: 26 de Março de Transparências elaboradas por Fabiano C. Botelho e Nivio Ziviani

MC102 - Algoritmos e programação de computadores. Aula 16: Busca e Ordenação em vetores

Transcrição:

Heapsort Heapsort é um método de ordenação cujo princípio de funcionamento é o mesmo utilizado para a ordenação por seleção. Selecione o maior (ou menor) item do vetor e a seguir troque-o com o item que está na última (ou primeira) posição do vetor; repita estas duas operações com os n - itens restantes; depois com os n - itens; e assim sucessivamente. 355

O custo para encontrar o maior (ou o menor) item entre n itens e de n - comparações. Este custo pode ser reduzido? SIM. Heapsort Este custo pode ser reduzido através da utilização de uma estrutura de dados chamada de fila de prioridades. 356

Fila de Prioridades Fila: Sugere espera por algum serviço. Prioridade: Sugere que o serviço será fornecido com base em um critério. Fila de Prioridade: Conjunto de elementos com o comportamento elemento-de-maior-valor (menor-valor) é o primeiro a abandonar o conjunto de elementos. 35

Aplicações de Filas de Prioridades Sistemas operacionais usam filas de prioridades, onde as chaves representam o tempo em que eventos devem ocorrer. Alguns métodos numéricos iterativos são baseados na seleção repetida de um item com maior (menor) valor. Sistemas de gerência de memória usam a técnica de substituir a página menos utilizada na memória principal do computador por uma nova página. 358

Fila de Prioridades Operações Principais:. Construir uma fila de prioridades a partir de um conjunto com n itens;. Retirar o item com maior prioridade; 3. Restaurar a fila de prioridades. Forma de implementação: Árvore binária 359

Árvore Binária Considerando as características de uma árvore binária de busca, um aluno atento chegará a seguinte reflexão: As chaves poderiam ser inseridas, uma a uma, em uma árvore binária de busca; Após a inserção de todas as chaves a árvore poderia ser percorrida, por exemplo, em in-ordem e as chaves seriam obtidas em ordem crescente. 36

Árvore Binária Desvantagens da utilização de uma árvore binária de busca: - Necessidade de área de memória adicional para o armazenamento da árvore; - O que aconteceria se as chaves já se encontrarem em ordem ou em ordem inversa? - Seria gerada um árvore degenerada. O que significa que para a inserção do i-ésimo elemento seriam requeridas i- comparações, o que, praticamente, elimina a vantagem de se utilizar uma árvore no processo. 36

36 As deficiências da classificação utilizando árvore binária ordenada são eliminadas no método denominado heap sort. O heap sort é um método in situ de complexidade constante, independente da ordem da entrada. Um heap decrescente de tamanho n é implementado utilizando-se uma árvore binária quase completa representada sequencialmente, com a característica de que todo nó possui um valor maior ou igual aos valores armazenados em seus filhos, caso estes existam.

Árvore Binária quase completa é uma árvore binária onde (revisão):. Cada folha na árvore está no nível d ou no nível d-;. Para todo nó nd que possui um descendente direito no nível d, todo descendente esquerdo de nd é folha no nível d ou tem filhos. Exemplo: Árvore binária quase completa R Índices 3 4 5 363 N 3 I 4 E 5 D L Valores R N L I E D Relação: info[j] info[(j-)/] para ((j-)/) j n-

Para uma melhor compreensão vamos analisar o processo de construção de um heap partindo de um conjunto de n elementos (chaves) sobre o exemplo onde o vetor de chaves originalmente é: 5 5 48 9 33 5 5 5 48 9 33 5 5 5 5 48 9 33 5 364 5 48

5 5 48 9 33 5 48 5 9 33 5 5 5 48 48 3 5 5 48 5 9 33 5 48 3 5 4 365

5 48 5 9 33 5 9 5 48 33 9 5 5 48 33 5 48 9 3 5 4 5 3 5 4 5 48 9 5 48 5 33 9 366 3 5 4 5 48 6 5

9 5 48 5 33 9 3 5 4 5 48 6 5 9 33 48 5 5 9 3 33 4 5 48 6 5 36 5

Exercício: Com base no que foi discutido implemente uma função, em C, que receba, como parâmetros, um vetor de inteiros e a quantidade de elementos no mesmo e retorne um vetor que represente um heap decrescente com os valores contidos inicialmente no vetor. 368

369 heap (int *x, int n) { int i, e, s, f; for (i=; i<n; i++) { e = x[i]; s = i; f = (s-)/; while (s> && x[f]<e) } } { x[s] = x[f]; s = f; f = (s-)/; } x[s] = e;

Agora que já definimos como receber um conjunto de chaves e transformá-lo em um heap devemos determinar como iremos utilizá-lo. Se observarmos a característica básica da árvore que representa o heap, perceberemos que a raiz contém o elemento de maior valor do conjunto de chaves. Sendo assim, podemos removê-lo e posicionálo no final do vetor que armazena o heap. Contudo, para isso temos que reorganizar o heap, mantendo sua propriedade e liberando espaço no final do vetor para colocar o elemento mencionado.

Vamos analisar este processo retomando o exemplo anterior. Considerando o vetor de chaves: 9 33 48 5 5 Que representa o heap: 9 3 33 4 5 48 6 5 5

9 3 33 4 5 48 6 5 Armazenaremos o último elemento do nosso vetor em uma variável auxiliar. aux 5 5 Agora podemos copiar o elemento de maior valor para aposição final do vetor. 9 3 33 4 5 48 6 5 9

9 3 33 4 5 48 6 5 aux 9 5 Podemos considerar a posição com índice zero como livre no vetor, reorganizar o heap e posicionar o valor armazenado em aux na posição correta. Como fazer isto? Escolhendo o maior dentre os filhos da raiz e deslocá-lo para tal posição. 3 33 4 5 48 6 5 3 9

3 33 4 5 48 6 5 Mantendo este raciocínio, teremos a posição com índice livre e a preencheremos com seu filho de maior valor. aux 5 9 4 Quando chegarmos ao último filho que foi movido teremos a posição de inserção do valor em aux. 9 5 3 33 4 5 48 6 5 aux 5 Após sua inserção teremos o heap do próximo slide.

5 3 33 4 5 48 6 5 9 Aplicando este procedimento ao subvetor de n- teremos: 5 48 3 33 4 5 5 6 5 9 aux 5

48 Aplicando este procedimento ao subvetor de n- teremos: 5 3 33 4 5 5 6 aux 5 9 Aplicando este procedimento ao subvetor de n-3 teremos: 33 5 3 4 48 5 5 6 aux 6 9

33 Aplicando este procedimento ao subvetor de n-3 teremos: 5 3 4 48 5 5 6 aux 9 Aplicando este procedimento ao subvetor de n-4 teremos: 33 5 3 4 48 5 5 6 aux 9

Aplicando este procedimento ao subvetor de n-5 teremos: 33 5 5 33 3 4 48 5 5 6 3 4 48 5 5 6 8 9 aux 5 Na última fase, n-6, não movemos diretamente o filho, analisamos seu valor e apenas se este for menor que aux o movemos. Com base no que foi discutido, codifique uma função, na linguagem C, que receba um vetor (de inteiros) e o número de elementos no mesmo e através do método heap sort ordene de forma crescente os elementos do vetor. 9