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

Documentos relacionados
ALGORITMOS DE ORDENAÇÃO RECURSIVOS

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

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

Estruturas de Dados Algoritmos de Ordenação

Métodos de Ordenação Parte 3

Algoritmos de ordenação

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

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

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

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

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

BCC202 - Estrutura de Dados I

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

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

Bubble Sort. Tempo total O(n 2 )

Estruturas de Dados 2

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

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

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

Projeto e Análise de Algoritmos

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

INF 1007 Programação II

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

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

Carlos Eduardo Batista. Centro de Informática - UFPB

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

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

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

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

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

Algoritmos de Ordenação: QuickSort

Métodos de Ordenação

Classificação por Particionamento

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

Linguagem C: Ordenação

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

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

Árvore Binária de Busca. Prof. César Melo

Algoritmos de Pesquisa e Ordenação em Vectores

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

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

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Tópico 5 Algoritmos de Ordenação. Parte I - métodos de ordenação: inserção, mergesort, heapsort e quicksort.

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

ALGORITMOS DE ORDENAÇÃO

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

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

Arvores binárias. Fonte: PF 14 pf/algoritmos/aulas/bint.html

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

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;

DAINF - Departamento de Informática

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

INF 1010 Estruturas de Dados Avançadas

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

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

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

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Análise e Complexidade de Algoritmos

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

Prova 1 PMR2300 / PMR3201 1o. semestre 2015 Prof. Thiago Martins

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

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

Estrutura de Dados. Diego Silveira Costa Nascimento

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

LISTAS LINEARES. Estrutura de Dados

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1

Ordenação. Insertion Sort

Recursividade. Objetivos do módulo. O que é recursividade

Algoritmos e Estrutura de Dados

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

UNIVERSIDADE DA BEIRA INTERIOR

ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES

Capacitação em Linguagem C Parte 2

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

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

ESTRUTURA DE DADOS (TCC )

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

Métodos de Ordenação Parte 4

Arquivos Sequenciais. Estruturas de Dados II Vanessa Braganholo

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

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

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

QuickSort CI/2015. Análise e Projeto de Algoritmos. - Prof. Lucídio A. F. Cabral

Programação de Computadores II. Cap. 16 Ordenação

Módulo 16 - Ordenação

Aula 3 Listas Lineares Sequenciais Ordenadas. prof Leticia Winkler

Algoritmos e Estruturas de Dados. Décima sexta aula: Quicksort

Algoritmos e Estruturas de Dados 2006/2007

Exemplo. Lista Inicial (Desordenada) a. Iteração: Pivô: 25. Elemento da Esquerda: 48 Elemento da Direita: 12

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

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

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

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

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

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

Extra- Algoritmos de Ordenação

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

Pesquisa e Ordenação

Transcrição:

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro pauloac@ita.br Sala 110 Prédio da Computação www.comp.ita.br/~pauloac IECE - ITA

MÉTODOS MAIS EFICIENTES QUE O(N 2 ) Método Quicksort Método Heap-Sort Método MergeSoft 2

O MÉTODO QUICK-SORT Generalidades e fundamentos Quick-Sort é provavelmente o algoritmo de ordenação mais usado por programadores em geral. Foi criado por C.Hoare em 1960. Durante muito tempo, pesquisadores de métodos de ordenação se dedicaram mais a aperfeiçoar o Quick-Sort do que a procurar novos métodos. 3

No caso médio, Quick-Sort é O(n log 2 n) e no pior caso é O(n 2 ). Quick-Sort é recursivo, mas pode ser transformado em não recursivo, mediante o uso de pilha. Quick-Sort aplica a técnica denominada divisão e conquista, que reparte o vetor a ser ordenado em dois sub- vetores e os ordena independentemente. 4

O método consiste em: 1. Escolher, mediante um critério razoável, um pivô entre todos os elementos do vetor a ser ordenado Bom é quando tal pivô é a mediana de todos os elementos, ou seja, quando ele consegue dividir o vetor ao meio Exemplo: seja o vetor V 5 5 1 4 1 3 9 2 3 8 3 6 Seja o maior entre os dois elementos distintos mais à esquerda escolhido como pivô (pivô = 5) 5

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes left right V 5 5 1 4 1 3 9 2 3 8 3 6 pivô = 5 Incondicionalmente, trocar V[left] com V[right] (para facilitar a elaboração do algoritmo) 6

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes left right V 6 5 1 4 1 3 9 2 3 8 3 5 pivô = 5 Mover left para a direita até V[left] pivô Mover right para a esquerda até V[right] < pivô 7

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes left right V 6 5 1 4 1 3 9 2 3 8 3 5 pivô = 5 Trocar V[left] com V[right] 8

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes left right V 3 5 1 4 1 3 9 2 3 8 6 5 pivô = 5 Mover left para a direita até V[left] pivô Mover right para a esquerda até V[right] < pivô 9

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes left right V 3 5 1 4 1 3 9 2 3 8 6 5 pivô = 5 Trocar V[left] com V[right] 10

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes left right V 3 3 1 4 1 3 9 2 5 8 6 5 pivô = 5 Mover left para a direita até V[left] pivô Mover right para a esquerda até V[right] < pivô 11

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes left right V 3 3 1 4 1 3 9 2 5 8 6 5 pivô = 5 Trocar V[left] com V[right] 12

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes left right V 3 3 1 4 1 3 2 9 5 8 6 5 pivô = 5 Mover left para a direita até V[left] pivô Mover right para a esquerda até V[right] < pivô 13

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes right left V 3 3 1 4 1 3 2 9 5 8 6 5 pivô = 5 A divisão está completa pois left > right 14

2. Dividir o vetor em 2 partes: sub-vetor baixo e sub-vetor alto, colocando no primeiro, todos os elementos menores que o pivô, e no segundo, os elementos restantes V 3 3 1 4 1 3 2 9 5 8 6 5 sub-vetor baixo sub-vetor alto pivô = 5 Pior caso: um dos sub-vetores com um só elemento e o outro com mais de um 15

Aplicar recursivamente os passos anteriores nos 2 subvetores formados Encerrar a recursividade quando, num dado subvetor, todos os seus elementos forem iguais Outros critérios para a escolha do pivô: Um dos elementos extremos do vetor Média de três elementos aleatórios 16

5.4.2 Programação void QuickSort } (int i,int j,vetor V) { int pivot, pivind, k; pivind = Pivo(i, j, V); if (pivind!= -1) { } V pivot = V[pivind]; k = Particao (i, j, pivot, V); QuickSort (i, k-1, V); QuickSort (k, j, V); sub-vetor i baixo k 3 3 1 4 1 3 2 9 5 8 QuickSort atua entre os índices i e j do vetor V Pivo retorna o índice do pivô no intervalo [i, j] do vetor V; retorna -1, caso o intervalo não tenha pivô (sem elementos distintos) Particao divide o intervalo [i, j] do vetor V nos sub-vetores baixo e alto, retornando o índice do 1º elemento no sub-vetor alto sub-vetor alto j 6 5 17

Função Pivô: retorna -1, se o vetor no trecho considerado não possui elementos distintos; caso contrário retorna o índice do maior entre os dois elementos distintos mais à esquerda. int Pivo (int i,int j, vetor V) { int prim, k, indpiv; int achou; prim = V[i]; achou = FALSE; k = i+1; indpiv = -1; while (! achou && k <= j) if (V[k] == prim) k++; else { achou = TRUE; if (V[k] > prim) indpiv = k; else indpiv = i; } return indpiv; } 18

Função Partição: faz a permutação dos elementos do vetor e acha o ponto de partição nos dois subvetores: int Particao (int i, int j,int piv; vetor V) { int left, right, aux; left = i; right = j; do { aux = V[left]; V[left] = V[right]; V[right] = aux; while (V[left] < piv) left++; while (V[right] >= piv) right--; } while (left <= right); return left; } 19

O MÉTODO HEAP-SORT Definição de heap Árvore binária completa: tem todos os nós possíveis em cada nível; exemplos: 20

Heap: árvore binária completa ou a árvore binária: Que é completa pelos menos até o seu penúltimo nível e Na qual as folhas do último nível estão o mais à esquerda possível. Exemplos: 21

A estrutura de um heap é única para um número fixo de nós Exemplo: o heap abaixo com 18 nós é único 22

Estrutura de dados para heap s: vetor de n inteiros Declarações: typedef int vetor[200]; struct heap {vet elem; int n;}; heap H1, H2; Observação: os nós são os índices do vetor; exemplo a seguir 23

Propriedades dessa representação: nó i: i ésima posição do vetor nó i tem como filhos 2i + 1 2i + 2 pai: (i-1) / 2 altura de um heap de n nós: log 2 n 24

5.5.2 Fila de prioridades a) Definição: é um heap em que o valor de um nó é sempre menor ou igual aos de seus eventuais filhos Exemplos: 25

b) Operação de deletar o elemento mínimo duma fila de prioridades: Inicialmente: 3 5 9 6 8 9 10 10 18 9 26

Retira-se a raiz e coloca-se ali o último elemento 5 9 6 8 9 10 10 18 9 27

trocar 9 5 9 6 8 9 10 10 18 28

trocar 5 9 9 6 8 9 10 10 18 29

fim da operação 5 6 9 9 8 9 10 10 18 30

c) Operação de inserir um elemento numa fila de prioridades: Seja a inserção do 1: 3 5 9 6 8 9 10 10 18 9 31

Coloca-se o elemento a ser inserido na última posição 3 5 9 trocar 6 8 9 10 10 18 9 1 32

3 5 trocar 9 6 1 9 10 10 18 9 8 33

trocar 3 1 9 6 5 9 10 10 18 9 8 34

fim da operação 1 3 9 6 5 9 10 10 18 9 8 35

5.5.3 Programação do Heap-Sort O método consiste em duas partes principais: 1. Inserir elemento por elemento do vetor numa fila de prioridades 2. Retirar pela raiz todos os elementos da fila de prioridades, retornando-os ao vetor 36

void HeapSort (int n, vetor V) { int i; heap H; } iniciar(&h); for (i = 0; i < n; i++) Inserir (V[i], &H); for (i = 0; i < n; i++) V[i] = DeletaMin (&H); void iniciar (heap *H) { } H->n = 0; 37

void Inserir (int x; heap *H) { int i, temp; if (H->n >= 200) else { } printf("insercao em heap cheio"); (H->n)++; i = H->n - 1; H->elem[i] = x; while (i > 0 && H->elem[i] < } temp = H->elem[i]; H->elem[(i-1)/2]) { H->elem[i] = H->elem[(i-1)/2]; H->elem[(i-1)/2] = temp; i = (i-1)/2; } 38

int DeletaMin (heap *H) { } int i, j, temp, ret; int parou; if (H->n == 0) { else { } printf ("Delecao em heap vazio"); return -1;} ret = H->elem[0]; H->elem[0] = H->elem[H->n - 1]; (H->n)--; parou = FALSE; i = 0; while (! parou && 2*i+1 <= H->n - 1) { } if (2*i+1 == H->n - 1 H->elem[2*i+1] < H->elem[2*i+2]) j = 2*i+1; else j = 2*i+2; if (H->elem[i] > H->elem[j]) { } temp = H->elem[i]; H->elem[i] = H->elem[j]; H->elem[j] = temp; i = j; else parou = TRUE; return ret; 39

Observações: O método Heap-Sort é O(n log n) no caso médio e no pior caso Altura de um heap de n nós: log 2 n No caso médio, Quick-Sort leva alguma vantagem sobre Heap-Sort Há um gasto maior de memória devido à variável H 40

O MÉTODO MERGE-SORT Merge: fundir num só dois vetores ordenados, mantendo a ordem. Mas, se inicialmente o vetor está desordenado, como fazer fusão? 41

Idéia recursiva: Caso o vetor tenha dois ou mais elementos: Dividir o vetor ao meio, obtendo a metade da esquerda e a metade da direita; Ordenar cada uma dessas metades pelo Merge-Sort; Fundir as duas metades ordenadas. 42

Fundir dois vetores ordenados: percorrê-los com cursores, comparando os elementos da posição dos mesmos; o menor é copiado num vetor temporário. Exemplo: Fusão dos seguintes vetores: V1: 3, 5, 8, 8, 11, 13, 16 e V2: 4, 5, 6, 7, 8, 9 43

No método Merge-Sort, os dois vetores são subvetores do vetor a ser ordenado V 3 5 8 8 11 13 16 4 5 6 7 8 9 44 V1 V2

void MergeSort (int first,int last, vetor V) { int med; } if (first < last) { } med = (first + last)/2; MergeSort (first, med, V); MergeSort (med+1, last, V); Merge (first, last, V); A seguir, ilustração do método Merge-Sort para o vetor: 8, 6, 4, 6, 5, 7, 1, 2, 9, 7, 2 45

46

void Merge (int first, last; vetor V) { int med, i, j, k; vetor T; med = (first + last)/2; i = 0; j = first; k = med + 1; while (j <= med && k <= last) { } if (V[j] < V[k]) {T[i] = V[j]; j++;} else {T[i] = V[k]; k++;} i++; while (j <= med) {T[i] = V[j]; j++; i++;} while (k <= last) {T[i] = V[k]; k++; i++;} for (j = first, i = 0; j <= last; j++, i++) V[j] = T[i]; } 47 Merge é O(n) e MergeSort é O(n log n)