Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto...

38
Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS

Transcript of Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto...

Page 1: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação Interna de Dados

Estrutura de Dados I

Prof. Mai-Ly Vanessa

Campus Prof. Alberto Carvalho - UFS

Page 2: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Introdução aos métodos de Introdução aos métodos de classificaçãoclassificação

Uma tarefa muito comum em programação é se Uma tarefa muito comum em programação é se colocar em ordem uma lista de valores.colocar em ordem uma lista de valores.

Na prática os valores a serem ordenados Na prática os valores a serem ordenados raramente serão valores isolados, em geral raramente serão valores isolados, em geral cada um deles fará parte de um registro. Cada cada um deles fará parte de um registro. Cada registro irá conter uma chave, que é o valor a registro irá conter uma chave, que é o valor a ser ordenado e o restante é chamado de dados ser ordenado e o restante é chamado de dados satélite (estes valores tem que ser permutados satélite (estes valores tem que ser permutados junto com a chave).junto com a chave).

Page 3: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Introdução aos métodos de Introdução aos métodos de classificaçãoclassificação

Se cada registro incluir uma quantidade muito Se cada registro incluir uma quantidade muito grande de dado satélite, pode-se ser permutado grande de dado satélite, pode-se ser permutado um arranjo de ponteiros para os registros em um arranjo de ponteiros para os registros em lugar de se permutar o próprio registro.lugar de se permutar o próprio registro.

O fato de ordenarmos números individuais ou O fato de ordenarmos números individuais ou grandes registros que contém números é grandes registros que contém números é irrelevante para o estudo de um método pelo irrelevante para o estudo de um método pelo qual um procedimento de ordenação determina qual um procedimento de ordenação determina a seqüência ordenada.a seqüência ordenada.

Para tornar a notação mais simplificada, neste Para tornar a notação mais simplificada, neste estudo consideraremos que a entrada será estudo consideraremos que a entrada será somente arrays de inteirossomente arrays de inteiros

Page 4: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação Bolha por SeleçãoClassificação Bolha por Seleção

Algoritmo não recursivo baseado em seleção de Algoritmo não recursivo baseado em seleção de elementos.elementos.

Não é tão eficiente, mas é considerado o mais Não é tão eficiente, mas é considerado o mais fácil de todos;fácil de todos;

Consiste em fixar uma posição e percorrer o Consiste em fixar uma posição e percorrer o restante do conjunto, cada vez que for restante do conjunto, cada vez que for encontrado um elemento menor que o fixado encontrado um elemento menor que o fixado este é trocado pelo elemento fixado.este é trocado pelo elemento fixado.

Fixa o próximo elemento do conjunto.Fixa o próximo elemento do conjunto. Desta forma ao fixarmos o penúltimo elemento Desta forma ao fixarmos o penúltimo elemento

do conjunto o mesmo estará ordenado do conjunto o mesmo estará ordenado Visto em Programação IVisto em Programação I

Page 5: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação Bubble Sort (1/2)Classificação Bubble Sort (1/2)Bolha por trocaBolha por troca

Algoritmo não recursivo, baseado em trocas de Algoritmo não recursivo, baseado em trocas de elementos, que consiste do seguinte:elementos, que consiste do seguinte:

• • Para I variando de 1 até N – 1, compara-se APara I variando de 1 até N – 1, compara-se A II com com AAI+1I+1, trocando-se os dois valores se A, trocando-se os dois valores se A II > A > AI+1I+1. Após . Após esse passo o maior valor ficará na última posição.esse passo o maior valor ficará na última posição.

• • Percorre-se novamente o array para Percorre-se novamente o array para II variando de 1 variando de 1 até N – 2, comparando-se os elementos adjacentes, até N – 2, comparando-se os elementos adjacentes, efetuando a troca se houver necessidade. Após esse efetuando a troca se houver necessidade. Após esse passo o segundo maior valor ficará na penúltima passo o segundo maior valor ficará na penúltima posição.posição.

• • Continua-se até que não haja nenhuma troca ou se Continua-se até que não haja nenhuma troca ou se chegar a situação de se comparar Achegar a situação de se comparar A11 com A com A22..

Page 6: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação Bubble Sort (2/2)Classificação Bubble Sort (2/2)

Page 7: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Algoritmo Bubble SortAlgoritmo Bubble Sort public static void ordenaBubbleSort(int array[]) { int fim, temp; boolean troquei; fim = array.length; do { troquei = false; for (int i = 0; i < fim-1; i++) if (array[i] > array[i+1]) { temp = array[i]; array[i] = array[i+1]; array[i+1] = temp; troquei = true; } fim--; }while (troquei && fim > 0); }

Page 8: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por Seleção Direta (1/2)Classificação por Seleção Direta (1/2)

Esse método consiste do seguinte:Esse método consiste do seguinte: • • Procura-se o menor valor entre os elementos Procura-se o menor valor entre os elementos

A1, A2, ... AN e coloca-se em A1;A1, A2, ... AN e coloca-se em A1; • • Procura-se o menor valor entre os elementos Procura-se o menor valor entre os elementos

A2, A3, ... AN e coloca-se em A2;A2, A3, ... AN e coloca-se em A2; • • Continua-se com o processo até chegar a Continua-se com o processo até chegar a

condição de procurarmos o menor valor entre condição de procurarmos o menor valor entre AN-1 e AN. Neste caso colocamos o menor em AN-1 e AN. Neste caso colocamos o menor em AN-1 e o maior em AN e terminamos o AN-1 e o maior em AN e terminamos o processo.processo.

Como exemplo consideremos o seguinte array:Como exemplo consideremos o seguinte array:

Page 9: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por Seleção Direta (2/2)Classificação por Seleção Direta (2/2)

Page 10: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Seleção diretaSeleção direta public static void ordenaSelecao(int array[]) { int IMenor, temp; for (int i = 0; i < array.length -1; i++) { IMenor = i; for (int k = i+1; k < array.length; k++) if (array[k] < array[IMenor]) IMenor = k; if (i != IMenor) { temp = array[i]; array[i] = array[IMenor]; array[IMenor] = temp; } } }

Page 11: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por Inserção (1/4)Classificação por Inserção (1/4)

Esse método consiste em se dividir a lista em duas: uma Esse método consiste em se dividir a lista em duas: uma classificada e a outra desclassificada. A seguir, cada classificada e a outra desclassificada. A seguir, cada elemento da lista desclassificada é inserido na elemento da lista desclassificada é inserido na classificada, aumentando-se consequentemente o classificada, aumentando-se consequentemente o tamanho da classificada e diminuindo-se o tamanho da tamanho da classificada e diminuindo-se o tamanho da desclassificada. Por exemplo, suponhamos que o desclassificada. Por exemplo, suponhamos que o arrayarray que desejamos classificar tenha os seguintes valores:que desejamos classificar tenha os seguintes valores:

(8, 2, 5, 3, 10, 7, 1, 4, 6, 9)(8, 2, 5, 3, 10, 7, 1, 4, 6, 9) Uma maneira de proceder a classificação é criar uma Uma maneira de proceder a classificação é criar uma

outra lista e, à medida que formos percorrendo os outra lista e, à medida que formos percorrendo os elementos da primeira lista iremos inserindo na segunda elementos da primeira lista iremos inserindo na segunda na posição correta, como mostrado a seguir:na posição correta, como mostrado a seguir:

Page 12: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por Inserção (2/4)Classificação por Inserção (2/4)

Page 13: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por Inserção (3/4)Classificação por Inserção (3/4)

Para implementar esse algoritmo, a primeira Para implementar esse algoritmo, a primeira idéia que nos vem à mente é usar dois idéia que nos vem à mente é usar dois arraysarrays. . Mas, se for observado atentamente, notamos Mas, se for observado atentamente, notamos que a lista da esquerda cresce exatamente na que a lista da esquerda cresce exatamente na mesma velocidade com que a da direita diminui. mesma velocidade com que a da direita diminui. Assim nós só precisamos de um Assim nós só precisamos de um arrayarray, ficando , ficando uma lista à esquerda do uma lista à esquerda do arrayarray e a outra à direita. e a outra à direita. A figura abaixo mostra a mesma figura anterior A figura abaixo mostra a mesma figura anterior porém usando somente um porém usando somente um arrayarray

Page 14: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por Inserção (4/4)Classificação por Inserção (4/4)

Page 15: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Algoritmo de Inserção DiretaAlgoritmo de Inserção Direta

Page 16: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por QuickSort (1/4)Classificação por QuickSort (1/4)

Método recursivo usa a técnica de dividir e Método recursivo usa a técnica de dividir e conquistar, ou seja ele resolve um conquistar, ou seja ele resolve um problema dividindo-o em dois ou mais problema dividindo-o em dois ou mais subproblemas e depois combinando a subproblemas e depois combinando a solução dos problemas menores para solução dos problemas menores para obter a solução do problema original.obter a solução do problema original.

Em sua execução o Quicksort realiza os Em sua execução o Quicksort realiza os seguintes passos:seguintes passos:

Page 17: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por QuickSort (2/4)Classificação por QuickSort (2/4)

1 – Escolhe um elemento do conjunto para pivô. 1 – Escolhe um elemento do conjunto para pivô. Pode-se ser escolhido qualquer elemento.Pode-se ser escolhido qualquer elemento.

2 – Particione os elementos restantes em duas 2 – Particione os elementos restantes em duas sequências L e G, tais que todo elemento em L sequências L e G, tais que todo elemento em L seja menor ou igual ao pivô e todo elemento em seja menor ou igual ao pivô e todo elemento em G seja maior que o pivô. No caso geral tanto L G seja maior que o pivô. No caso geral tanto L quanto G não estão ordenados.quanto G não estão ordenados.

Realize o QuickSort recursivamente para as Realize o QuickSort recursivamente para as sequências L e G não ordenadas.sequências L e G não ordenadas.

Um conjunto de um único elemento é Um conjunto de um único elemento é considerado ordenado.considerado ordenado.

Page 18: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por QuickSort (3/4)Classificação por QuickSort (3/4)

Exemplos de classificaçãoExemplos de classificação O algoritmo possui complexidade média O algoritmo possui complexidade média

O(n log n) e pior caso de O(n²), entretanto O(n log n) e pior caso de O(n²), entretanto a probabilidade de ocorrer o pior caso é a probabilidade de ocorrer o pior caso é muito pequena, sendo um dos algoritmos muito pequena, sendo um dos algoritmos mais usados em ordenação.mais usados em ordenação.

Page 19: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

AAllggoorriitt

mmoo

public static void QSort(int vet[], int inicio, int fim) { int i, j, x, aux; i = inicio; j = fim; x = vet[(i+j)/2]; System.out.println("Inicio=" + i+ "fim = "+j+"meio="+x); do { while (vet[i] < x) i++; while (vet[j] > x) j--; if (i <= j) { aux = vet[i]; vet[i] = vet[j]; vet[j] = aux; i++; j--; } }while(i<=j); if (inicio < j) QSort(vet,inicio,j); if (i < fim) QSort(vet,i,fim); }

Page 20: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por MergeSortClassificação por MergeSort

É um algoritmo do tipo dividir e conquistar que realiza É um algoritmo do tipo dividir e conquistar que realiza uma classificação por Fusão. uma classificação por Fusão.

Um problema com o Quicksort é que sua complexidade Um problema com o Quicksort é que sua complexidade no pior caso é O(n²) por ser difícil controlar o processo no pior caso é O(n²) por ser difícil controlar o processo de particionamento, não se tem garantias que os vetores de particionamento, não se tem garantias que os vetores particionados serão mais ou menos de mesmo tamanhoparticionados serão mais ou menos de mesmo tamanho

Desenvolvido por John Von Newmann foi um dos Desenvolvido por John Von Newmann foi um dos primeiros algoritmos de ordenação usados em um primeiros algoritmos de ordenação usados em um computador.computador.

Um vetor temporário tem que ser usado para o processo Um vetor temporário tem que ser usado para o processo de fusão. Após a fusão estar completa o conteúdo do de fusão. Após a fusão estar completa o conteúdo do vetor temporário é transferido para o vetor original.vetor temporário é transferido para o vetor original.

Page 21: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por MergeSortClassificação por MergeSort

O algoritmo segue os seguintes passos:O algoritmo segue os seguintes passos: Se o conjunto tiver pelo menos 2 elementosSe o conjunto tiver pelo menos 2 elementos

Chama recursivamente MergeSort com a metade Chama recursivamente MergeSort com a metade esquerda do conjuntoesquerda do conjunto

Chama recursivamente MergeSort com a metade Chama recursivamente MergeSort com a metade direita do conjuntodireita do conjunto

Na volta das chamadas recursivas as metades Na volta das chamadas recursivas as metades vão sendo fundidas ordenadamente no vetor vão sendo fundidas ordenadamente no vetor temporáriotemporário

Após concluída a fusão o conteúdo do vetor Após concluída a fusão o conteúdo do vetor temporário é transferido para o vetor original.temporário é transferido para o vetor original.

Page 22: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

AAllggoorriittmmoo

Page 23: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort Desenvolvido em 1964 por Robert Floyd e John Desenvolvido em 1964 por Robert Floyd e John

WilliansWillians Tem um desempenho em tempo de execução Tem um desempenho em tempo de execução

muito bom em conjuntos ordenados muito bom em conjuntos ordenados aleatoriamente. aleatoriamente.

Seu desempenho no pior caso é praticamente Seu desempenho no pior caso é praticamente igual ao seu desempenho no caso médio. igual ao seu desempenho no caso médio.

O tempo de execução em pior cenário para O tempo de execução em pior cenário para ordenar é de O(n log n).ordenar é de O(n log n).

É um algoritmo de ordenação por seleção.É um algoritmo de ordenação por seleção. Esta ordenação usa uma estrutura chamada Esta ordenação usa uma estrutura chamada

heap (monte).heap (monte).

Page 24: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort

Um heap é uma árvore binária completa.Um heap é uma árvore binária completa. A árvore está completamente preenchida em A árvore está completamente preenchida em

todos os níveis exceto no nível mais baixo que todos os níveis exceto no nível mais baixo que deve ser preenchido a partir da esquerda até deve ser preenchido a partir da esquerda até certo ponto.certo ponto.

Cada nó da árvore corresponde a um elemento Cada nó da árvore corresponde a um elemento do conjunto.do conjunto.

Este heap pode ser armazenado como um Este heap pode ser armazenado como um vetor.vetor.

Antes de vermos como relacionar o vetor com o Antes de vermos como relacionar o vetor com o heap vejamos alguns conceitos sobre árvores.heap vejamos alguns conceitos sobre árvores.

Page 25: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort(Alguns conceitos básicos sobre árvores)(Alguns conceitos básicos sobre árvores)

Uma árvore consiste em um conjunto de Uma árvore consiste em um conjunto de elementos chamados de elementos chamados de NÓSNÓS..

Um dos nós da árvore, o que estiver situado Um dos nós da árvore, o que estiver situado acima de todos os outros é chamado de acima de todos os outros é chamado de RAIZRAIZ..

Esquematicamente, uma árvore pode ser representada da seguinte forma:

Page 26: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Cada nó da árvore é a raiz de uma subárvore.Cada nó da árvore é a raiz de uma subárvore. Um nó que não possua outros nós abaixo dele é Um nó que não possua outros nós abaixo dele é

chamado de chamado de folhafolha ou nó terminal. ou nó terminal. A raiz de uma árvore é chamada de A raiz de uma árvore é chamada de paipai das das

raízes das suas subárvores.raízes das suas subárvores. As raízes das subárvores de um nó são As raízes das subárvores de um nó são

chamadas de chamadas de irmãosirmãos,, que por sua vez são que por sua vez são filhosfilhos de um nó pai. de um nó pai.

Um Um árvore bináriaárvore binária é uma estrutura do tipo é uma estrutura do tipo árvore, onde cada nó pode ter no máximo dois árvore, onde cada nó pode ter no máximo dois filhos, que serão chamados respectivamente de filhos, que serão chamados respectivamente de filho da esquerda filho da esquerda e e filho da direitafilho da direita..

Classificação por HeapSortClassificação por HeapSort(Alguns conceitos básicos sobre árvores)(Alguns conceitos básicos sobre árvores)

Page 27: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort(Alguns conceitos básicos sobre árvores)(Alguns conceitos básicos sobre árvores)

Exemplo de árvore binária:Exemplo de árvore binária:

Page 28: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort(Alguns conceitos básicos sobre árvores)(Alguns conceitos básicos sobre árvores)

Page 29: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort(Alguns conceitos básicos sobre árvores)(Alguns conceitos básicos sobre árvores)

Uma árvore binária é denominada Uma árvore binária é denominada cheiacheia se todas as folhas estão se todas as folhas estão no mesmo nível e todos os nós não-folhas têm dois filhos.no mesmo nível e todos os nós não-folhas têm dois filhos.

Uma árvore binária de altura Uma árvore binária de altura hh é denominada é denominada completacompleta se ela for se ela for cheia até o nível h-1 e os nós do nível cheia até o nível h-1 e os nós do nível hh ocupam as posições mais ocupam as posições mais à esquerda da árvore. à esquerda da árvore.

Page 30: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort

Revendo os conceitos sobre heap:Revendo os conceitos sobre heap: Um heap é uma árvore binária completa.Um heap é uma árvore binária completa. A árvore está completamente preenchida em A árvore está completamente preenchida em

todos os níveis exceto no nível mais baixo todos os níveis exceto no nível mais baixo que deve ser preenchido a partir da esquerda que deve ser preenchido a partir da esquerda até certo ponto.até certo ponto.

Cada nó da árvore corresponde a um Cada nó da árvore corresponde a um elemento do conjunto.elemento do conjunto.

Este heap pode ser armazenado como um Este heap pode ser armazenado como um vetor.vetor.

Page 31: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort

A raiz da árvore é dada por vet[1].Dado o índice i de um nó os índices de seu pai,

de seu filho da esquerda e filho da direita podem ser calculados facilmente por:

Page 32: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort Pai (i) = i/2Pai (i) = i/2 Filho da esquerda (i) = 2 * iFilho da esquerda (i) = 2 * i Filho da direita (i) = 2*i + 1Filho da direita (i) = 2*i + 1

Um heap pode ser máximo ou mínimo. Um heap Um heap pode ser máximo ou mínimo. Um heap máximo obedece a seguinte propriedade:máximo obedece a seguinte propriedade: O pai de um nó sempre é maior ou igual a seus filhosO pai de um nó sempre é maior ou igual a seus filhos

Desta forma o maior valor de um heap máximo Desta forma o maior valor de um heap máximo sempre estará em sua raiz.sempre estará em sua raiz.

Neste método de classificação trabalharemos Neste método de classificação trabalharemos com heaps máximos.com heaps máximos.

Page 33: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort A idéia do Heapsort é organizar o vetor como A idéia do Heapsort é organizar o vetor como

uma árvore binária completa.uma árvore binária completa. Transformar esta árvore em um heap máximo Transformar esta árvore em um heap máximo

usando o método de Floyd “base para cima”.usando o método de Floyd “base para cima”. Trocar a raiz com a última folha da árvore.Trocar a raiz com a última folha da árvore. ““Podar” a última folha da árvore.Podar” a última folha da árvore. Regenerar o heap, que agora está com n-1 Regenerar o heap, que agora está com n-1

elementos.elementos. Trocar a raiz com a última folha da árvore e Trocar a raiz com a última folha da árvore e

assim por diante até que se tenha uma árvore assim por diante até que se tenha uma árvore de um único elemento.de um único elemento.

Page 34: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Em outras palavras a idéia do algoritmo HeapSort é Em outras palavras a idéia do algoritmo HeapSort é encontrar o maior elemento (se construirmos um heap encontrar o maior elemento (se construirmos um heap será a raiz do heap) entre n elementos e o trocar com a será a raiz do heap) entre n elementos e o trocar com a última posição do vetor (a última folha). última posição do vetor (a última folha).

Considerar como se esta posição tivesse sido tirada do Considerar como se esta posição tivesse sido tirada do vetor (na verdade vamos apenas decrementar o fim da vetor (na verdade vamos apenas decrementar o fim da parte válida do vetor). parte válida do vetor).

Procura novamente o maior elemento entre os n-1 Procura novamente o maior elemento entre os n-1 elementos restantes colocando-a na última posição elementos restantes colocando-a na última posição válida do vetor atual, decrementar o “fim válido” do vetor.válida do vetor atual, decrementar o “fim válido” do vetor.

Continua fazendo isto enquanto a parte “válida” do vetor Continua fazendo isto enquanto a parte “válida” do vetor conter mais de um elemento.conter mais de um elemento.

Classificação por HeapSortClassificação por HeapSort

Page 35: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

Classificação por HeapSortClassificação por HeapSort Vejamos no quadro como funciona o método Vejamos no quadro como funciona o método

Floyd “Base para cima” de criação e regeneração Floyd “Base para cima” de criação e regeneração de um heap:de um heap: Percorre-se todos os pais da árvore indo do fim da Percorre-se todos os pais da árvore indo do fim da

mesma para o começo. Cada vez que se encontrar um mesma para o começo. Cada vez que se encontrar um pai que possua um filho maior que ele troca-se o valor pai que possua um filho maior que ele troca-se o valor do pai pelo valor de seu maior filho. Após todos os do pai pelo valor de seu maior filho. Após todos os pais da árvore terem sido percorridos ela será um pais da árvore terem sido percorridos ela será um heap. Poderemos então trocar o valor da raiz da heap. Poderemos então trocar o valor da raiz da árvore com o do último elemento do vetor. árvore com o do último elemento do vetor. Considerando um conjunto de n-1 elementos, Considerando um conjunto de n-1 elementos, começamos tudo novamente.começamos tudo novamente.

O algoritmo HeapSort será divido em quatro O algoritmo HeapSort será divido em quatro métodos:métodos:

Page 36: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

AAllggoorriitt

mmoo

Parte 1Parte 1

Page 37: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

AAllggoorriitt

mmoo

Parte 2

Page 38: Classificação Interna de Dados Estrutura de Dados I Prof. Mai-Ly Vanessa Campus Prof. Alberto Carvalho - UFS.

O método heapSort recebe como argumento um vetor O método heapSort recebe como argumento um vetor desordenado e após sua execução o vetor estará desordenado e após sua execução o vetor estará ordenado.ordenado.

O método maxHeapify é uma importante rotina. Ela O método maxHeapify é uma importante rotina. Ela recebe como entrada o arranjo recebe como entrada o arranjo vv e um índice e um índice pospos para o para o arranjo, além do tamanho “válido” do vetor. Quando este arranjo, além do tamanho “válido” do vetor. Quando este método é chamado supomos que suas subárvores método é chamado supomos que suas subárvores esquerda e direita são heap máximos mas que o próprio esquerda e direita são heap máximos mas que o próprio nó nó v[pos]v[pos] pode ser menor que seus filhos violando assim pode ser menor que seus filhos violando assim a propriedade de heap máximo. A função de maxHeapify a propriedade de heap máximo. A função de maxHeapify é deixar que o valor em é deixar que o valor em v[pos]v[pos] flutue para baixo tornando flutue para baixo tornando assim esta subárvore, com raiz em assim esta subárvore, com raiz em pospos, também um , também um heap máximo.heap máximo.

O método buildMaxHeap percorre os pais da árvore de O método buildMaxHeap percorre os pais da árvore de baixo para cima executando maxHeapify sobre cada um baixo para cima executando maxHeapify sobre cada um deles. deles.

O método swap simplesmente faz a troca entre dois O método swap simplesmente faz a troca entre dois elementos da árvore.elementos da árvore.