UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA Heapsort ordenação por árvore de seleção Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa
Prof. Yandre Maldonado - 2 Métodos de ordenação interna: Simples: complexidade média O(n 2 ); Eficientes: complexidade média O(n log n); Simples: Inserção; Seleção; Troca (bolha); Eficientes: Shell (ou shellsort); Quick (ou quicksort); Heap (ou heapsort).
Prof. Yandre Maldonado - 3 Método proposto por Floyd e Williams, em 1964; É considerado um método de ordenação de bom desempenho; O desempenho no pior caso é semelhante ao caso médio; É considerado uma variação do método de ordenação por seleção; Faz um uso comportado da memória;
Prof. Yandre Maldonado - 4 O método consiste em: Transformar a seqüência inicial em uma seqüência que esteja associada à uma estrutura do tipo heap; Heap é uma árvore binária em que: A diferença máxima de altura entre os nós folha é de um nível; Os nós do nível mais profundo são preenchidos da esquerda para a direita; Todo nó deve armazenar uma chave maior do que as dos seus filhos;
Prof. Yandre Maldonado - 5 Um heap pode ser representado em um vetor com índices c 1, c 2,..., c n da seguinte forma: Para toda chave c i, com i entre 1 e n div 2: c 1 é a raiz da árvore; c 2i é a raiz da sub-árvore esquerda de c i e c 2i+1 é a raiz da sub-árvore direita de c i ;
Para um vetor com índices de 1 a 7 haveria o seguinte heap associado: Prof. Yandre Maldonado - 6 c 1 c 2 c 3 c 4 c 5 c 6 c 7 C 1 C 2 C 3 C 4 C 5 C 6 C 7
A seqüência de chaves descrita a seguir será transformada em um heap: Prof. Yandre Maldonado - 7 `19 5 30 11 9 12 20 19 5 30 11 9 12 20 Para que a estrutura seja um heap, cada nó deve ter chave maior do que as chaves de seus filhos.
A transformação começa a partir do nó que ocupa a posição n div 2 do vetor, neste caso a posição de índice 3: Prof. Yandre Maldonado - 8 `19 5 30 11 9 12 20 19 5 30 11 9 12 20 Como esta subárvore respeita o critério para formação do heap, volta-se para o nó associado à posição anterior do vetor.
Os próximos nós serão obtidos decrementando-se o índice no vetor até atingir o índice 1: Prof. Yandre Maldonado - 9 `19 5 30 11 9 12 20 19 5 30 11 9 12 20 Neste ponto, percebe-se que a chave 5 é menor do que a dos seus filhos, então troca-se as posições desta chave com a maior chave associada aos seus filhos.
Os próximos nós serão obtidos decrementando-se o índice no vetor até atingir o índice 1: Prof. Yandre Maldonado - 10 `19 11 30 5 9 12 20 19 11 30 5 9 12 20 Agora esta subárvore respeita o critério para formação do heap. Com isto, volta-se para o nó associado à posição anterior do vetor.
O índice 1 finalmente foi atingido: Prof. Yandre Maldonado - 11 `19 11 30 5 9 12 20 19 11 30 5 9 12 20 Neste ponto, percebe-se que a chave 19 é menor do que a de um dos seus filhos, então troca-se a posição destas chaves.
Agora, percebe-se que esta última troca trouxe um novo problema ao heap como um todo : Prof. Yandre Maldonado - 12 `30 11 19 5 9 12 20 30 11 19 5 9 12 20 Para corrigir este problema, percorre-se agora no sentido inverso as posições, de 1 até n div 2.
Para corrigir o problema, percorre-se agora no sentido inverso as posições, de 1 até n div 2: Prof. Yandre Maldonado - 13 `30 11 19 5 9 12 20 30 11 19 5 9 12 20 Esta sub-árvore respeita o critério para formação do heap. Com isto, passa-se para a próxima posição do vetor.
Para corrigir o problema, percorre-se agora no sentido inverso as posições, de 1 até n div 2: Prof. Yandre Maldonado - 14 `30 11 19 5 9 12 20 30 11 19 5 9 12 20 Esta sub-árvore respeita o critério para formação do heap. Com isto, passa-se para a próxima posição do vetor.
Para corrigir o problema, percorre-se agora no sentido inverso as posições, de 1 até n div 2: Prof. Yandre Maldonado - 15 `30 11 19 5 9 12 20 30 11 19 5 9 12 20 Neste ponto, percebe-se que a chave 19 é menor do que a de um dos seus filhos, então troca-se a posição destas chaves.
Para corrigir o problema, percorre-se agora no sentido inverso as posições, de 1 até n div 2: Prof. Yandre Maldonado - 16 `30 11 20 5 9 12 19 30 11 20 5 9 12 19 A varredura do índice 1 até n div 2 deve ser repetida até que nenhuma nova troca ocorra. Assim, o heap estará definitivamente formado.
Formado o heap, sabe-se que a maior de todas as chaves está posicionada na primeira posição do vetor: Prof. Yandre Maldonado - 17 `30 11 20 5 9 12 19 30 11 20 5 9 12 19 Neste caso, nenhuma nova troca acontece, portanto o heap já está formado.
Com isto, troca-se a posição da primeira chave com a última no vetor: Prof. Yandre Maldonado - 18 `19 11 20 5 9 12 30 19 11 20 5 9 12 Sabendo-se que a posição definitiva da maior de todas as chaves será a última do vetor, faz-se a troca entre a chave do primeiro e a do último índice.
Prof. Yandre Maldonado - 19 Entende-se que a última chave já encontrou sua posição definitiva e as demais passam a formar um novo heap, de tamanho menor: `19 11 20 5 9 12 30 Novo heap 19 11 20 5 9 12 O heap agora será formado pelas chaves que estão nas posições entre os índices 1 e 6.
Prof. Yandre Maldonado - 20 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: `19 11 20 5 9 12 30 19 11 20 5 9 12 Neste ponto, percebe-se que a chave 19 é menor do que a de um dos seus filhos, então troca-se a posição destas chaves. * Sem alterar chaves das células sombreadas, que já se encontram em suas posições definitivas.
Prof. Yandre Maldonado - 21 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 20 11 19 5 9 12 30 20 11 19 5 9 12 * Sem alterar chaves das células sombreadas, que já se encontram em suas posições definitivas.
Prof. Yandre Maldonado - 22 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 20 11 19 5 9 12 30 20 11 19 5 9 12 Esta sub-árvore respeita o critério para formação do heap, já que a posição de índice 7 do vetor não é mais parte do heap. * Sem alterar chaves das células sombreadas, que já se encontram em suas posições definitivas.
Atingido o índice n div 2, o heap está finalmente restabelecido: Prof. Yandre Maldonado - 23 20 11 19 5 9 12 30 20 11 19 5 9 12 Restabelecido o heap, a chave que ocupa a posição de índice 1 pode ser trocada com a que está no último índice associado ao heap.
Agora, mais uma chave encontrou sua posição definitiva e as demais passam a formar um novo heap, de tamanho menor: Prof. Yandre Maldonado - 24 12 11 19 5 9 20 30 Novo heap 12 11 19 5 9 O heap agora será formado pelas chaves que estão nas posições entre os índices 1 e 5.
Prof. Yandre Maldonado - 25 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 12 11 19 5 9 20 30 12 11 19 5 9 Neste ponto, percebe-se que a chave 12 é menor do que a de um dos seus filhos, então troca-se a posição destas chaves. * Sendo n igual a 5 neste momento. As posições sombreadas não podem mais ser alteradas.
Prof. Yandre Maldonado - 26 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 19 11 12 5 9 20 30 19 11 12 5 9 * Sendo n igual a 5 neste momento. As posições sombreadas não podem mais ser alteradas.
Prof. Yandre Maldonado - 27 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 19 11 12 5 9 20 30 19 11 12 5 9 O índice 2 era o último a ser percorrido nesta variação, com isto, o heap está formado e a chave que ocupa o índice 1 pode ser trocada com aquela que ocupa a última posição do heap. * Sendo n igual a 5 neste momento. As posições sombreadas não podem mais ser alteradas.
Agora, mais uma chave encontrou sua posição definitiva e as demais passam a formar um novo heap, de tamanho menor: Prof. Yandre Maldonado - 28 9 11 12 5 19 20 30 Novo heap 5 9 11 12 O heap agora será formado pelas chaves que estão nas posições entre os índices 1 e 4.
Prof. Yandre Maldonado - 29 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 9 11 12 5 19 20 30 5 9 11 12 Neste ponto, percebe-se que a chave 9 é menor do que as suas filhas, então troca-se a posição dela com a da maior das filhas. * Sendo n igual a 4 neste momento. As posições sombreadas não podem mais ser alteradas.
Prof. Yandre Maldonado - 30 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 12 11 9 5 19 20 30 5 12 11 9 O índice 2 era o último a ser percorrido nesta variação, com isto, o heap está formado e a chave que ocupa o índice 1 pode ser trocada com aquela que ocupa a última posição do heap. * Sendo n igual a 4 neste momento. As posições sombreadas não podem mais ser alteradas.
Prof. Yandre Maldonado - 31 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 5 11 9 12 19 20 30 5 11 9 Neste ponto, percebe-se que a chave 5 é menor do que as suas filhas, então troca-se a posição dela com a da maior das filhas. * Sendo n igual a 3 neste momento. As posições sombreadas não podem mais ser alteradas.
Prof. Yandre Maldonado - 32 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 11 5 9 12 19 20 30 11 5 9 Restabelecido o heap, a chave da posição de índice 1 pode ser trocada com a da posição de índice 3. * Sendo n igual a 3 neste momento. As posições sombreadas não podem mais ser alteradas.
Prof. Yandre Maldonado - 33 Para restabelecer o heap, percorre-se as chaves no vetor a partir da posição 1 até a posição n div 2 * percorrendo apenas os índices que correspondam a elementos eventualmente trocados: 9 5 11 12 19 20 30 5 9 Esta sub-árvore respeita o critério para formação de um heap. Assim, a chave da posição de índice 1 pode ser trocada com a do índice 2. * Sendo n igual a 2 neste momento. As posições sombreadas não podem mais ser alteradas.
Prof. Yandre Maldonado - 34 5 9 11 12 19 20 30 Seqüência ordenada!
Prof. Yandre Maldonado - 35 Desempenho do Heapsort: Médio: O (n log n); Pior caso: O (n log n); Boa opção para situações em que é necessário garantir que a ordenação não esteja sujeita a um desempenho desastroso; Não indicado para quantidades pequenas de chaves devido ao custo da reconstrução do heap; Desempenho médio duas vezes inferior ao do Quicksort.
Bibliografia Heapsort Prof. Yandre Maldonado - 36 Azeredo, P. A. Métodos de Classificação de Dados e Análise de suas Complexidades. Rio de Janeiro: Editora Campus, 1996; Moraes, Celso Roberto. Estruturas de Dados e Algoritmos. São Paulo: Berkeley Brasil, 2001; Wirth, N. Algoritmos e Estruturas de Dados. Rio de Janeiro: LTC, 1999; Ziviani, N. Projeto de Algoritmos. São Paulo: Pioneira Thomson Learning, 2002.