SlideShare une entreprise Scribd logo
1  sur  6
Télécharger pour lire hors ligne
ALGORITMOS E ESTRUTURAS DE DADOS III
                                    Tutorial 7 (usa o compilador de linguagem C Dev-C++ versão 4.9.9.2)




Parte 1 de 3 sobre o algoritmo de ordenação heap (monte) conhecido como Heapsort.
Tem um desempenho em tempo de execução
    1 INTRODUÇÃO                                          muito bom em conjuntos ordenados aleatoria-
                                                          mente, tem um uso de memória bem comportado
    Esta série de tutoriais sobre Algoritmos e Estrutu-   e o seu desempenho em pior cenário é pratica-
    ras de Dados III foi escrita usando o Microsoft       mente igual ao desempenho em cenário médio.
    Windows 7 Ultimate, Microsoft Office 2010,            Alguns algoritmos de ordenação rápidos têm de-
    Bloodshed Dev-C++ versão 4.9.9.2 (pode ser bai-       sempenhos espetacularmente ruins no pior cená-
    xado em http://www.bloodshed.net), referências        rio, quer em tempo de execução, quer no uso da
    na internet e notas de aula do professor quando       memória. O Heapsort trabalha no lugar e o tempo
    estudante. Ela cobre desde os algoritmos de or-       de execução em pior cenário para ordenar n ele-
    denação, passando pela pesquisa em memória            mentos é de (        ). Para valores de n, razoa-
    primária e culminando com a pesquisa em me-           velmente grande, o termo        é quase constan-
    mória secundária.                                     te, de modo que o tempo de ordenação é quase
                                                          linear com o número de itens a ordenar.
    Nós entendemos que você já conhece o compila-
    dor Dev-C++. No caso de você ainda não o conhe-
    cer, dê uma olhada nos tutoriais Dev-C++ 001 a        2.1 UMA OLHADA NO FUNCIONAMENTO
    017, começando pelo Tutorial Dev-C++ - 001 -          DO ALGORITMO
    Introdução.
                                                          O Heapsort utiliza uma estrutura de dados cha-
    Se não tem problemas com a linguagem C/C++ e          mada heap, para ordenar os elementos a medida
    o compilador Dev-C++, então o próximo passo é         que os insere na estrutura. Assim, ao final das
    saber ler, criar e alterar arquivos em disco usan-    inserções, os elementos podem ser sucessiva-
    do linguagem C/C++. Se ainda não sabe como            mente removidos da raiz da heap, na ordem dese-
    fazê-lo, dê uma olhada nos tutoriais Dev-C++ 001      jada, lembrando-se sempre de manter a proprie-
    e 002, começando pelo Tutorial Dev-C++ 001 –          dade de max-heap.
    Criação, Leitura e Alteração de Arquivos.
                                                          A heap pode ser representada como uma árvore
    Se sabe todas as coisas anteriores, então a pró-      (uma árvore binária com propriedades especiais 1)
    xima etapa é conhecer os algoritmos mais básicos      ou como um vetor. Para uma ordenação crescen-
    de ordenação. Em minhas notas de aula você            te, deve ser construído um heap máximo (o maior
    encontra um material básico, porém detalhado e        elemento fica na raiz, isto é, primeiro elemento do
    com algoritmos resolvidos, dos principais méto-       vetor). Para uma ordenação decrescente, deve ser
    dos de ordenação existentes.                          construído um heap mínimo (o menor elemento
                                                          fica na raiz).
    Adotaremos o livro Projeto de Algoritmos com
    Implementação em Pascal e C, Editora Cengage          2.1 A FUNÇÃO PENEIRA
    Learning, de Nivio Ziviani, como livro-texto da
    disciplina. Nele você encontrará os métodos de        O coração de qualquer algoritmo que manipule
    ordenação que iremos estudar.                         um max-heap é uma função que recebe um vetor
                                                          arbitrário v[1..m] e um índice p e faz v[p] "descer"
    Seu próximo passo será estudar os algoritmos de       para sua posição "correta".
    ordenação por Inserção, Seleção, Shellsort e
    Quicksort. Você pode usar os links anteriores         Como se faz isso? A ideia é óbvia. Se v[p] ≥ v[2p] e
    (em inglês) ou fazer uso do livro-texto.              v[p] ≥ v[2p + 1] então não é preciso fazer nada. Se
                                                          v[p] < v[2p] e v[2p] ≥ v[2p + 1] então basta trocar
    Se você seguiu todos os passos até aqui, está         v[p] com v[2p] e depois fazer v[2p] "descer" para
    pronto para prosseguir com este tutorial.             sua posição "correta". Não é difícil imaginar o que
                                                          se deve fazer no terceiro caso.
    2 O ALGORITMO DE ORDENAÇÃO
                                                          Eis um exemplo com p = 1. Cada linha da tabela
    HEAPSORT                                              é uma "foto" do vetor no início de uma iteração.
    O algoritmo Heapsort é um algoritmo de ordena-
    ção generalista, e faz parte da família de algorit-
    mos de ordenação por seleção. Foi desenvolvido
    em 1964 por Robert W. Floyd e J.W.J. Williams.        1 BAASE, Sara. Computer Algorithms: Introduction to
                                                          Design and Analysis (em inglês). 2a ed. Reading, Massachu-
                                                          setts: Addison-Wesley, 1988. 71 p. ISBN 0-201-06035-3


1
85     99   98   97   96   95   94   93   92   91   90   89   87   86   esse número não passa de         , pois o valor de
                                                                                f pelo menos dobra a cada iteração.
        99     85   98   97   96   95   94   93   92   91   90   89   87   86


                                                                                2.2 EXERCÍCIOS
        99     97   98   85   96   95   94   93   92   91   90   89   87   86
                                                                                1. A seguinte alternativa para a função peneira
        99     97   98   93   96   95   94   85   92   91   90   89   87   86      funciona corretamente2?

                                                                                    void peneira (int p, int m, int v[]) {
    Eis uma função iterativa que faz o serviço. A va-                                  int x;
    riável f é sempre um filho de p; no início de cada                                 int f;
    iteração, f é ajustado de modo a ser o filho de
    maior valor de p.                                                                   for(f = 2 * p; f <= m; f *= 2) {
                                                                                           if((f < m) && (v[f] < v[f + 1])) ++f;
    //       Recebe p em 1..m e rearranja o vetor v[1..m]                                  p = f / 2;
                                                                                           if(v[p] >= v[f]) break;
    //       de modo que o "subvetor" cuja raiz é p seja
    //       um max-heap.                                                                  x = v[p];
                                                                                           v[p] = v[f];
    //       Supõe que os "subvetores" cujas raízes são
                                                                                           v[f] = x;
    //       filhos de p já são max-heaps.
                                                                                        }
                                                                                    }
    void peneira (int p, int m, int v[]) {
       int f = 2 * p;                                                           2. Escreva uma versão recursiva da função pe-
       int x;                                                                      neira.

             while(f <= m) {
                                                                                3. Por que a seguinte implementação de peneira
               if((f < m) && (v[f] < v[f + 1])) ++f;
                                                                                   não funciona?
               // f é o filho "mais valioso" de p
               if (v[f / 2] >= v[f]) break;
                                                                                    void peneira (int p, int m, int v[]) {
               x = v[f / 2];
                                                                                       int x;
               v[f / 2] = v[f];
                                                                                       int f = 2 * p;
               v[f] = x;
               f *= 2;
                                                                                        while(f <= m) {
             }
                                                                                          if(v[p] < v[f]) {
    }
                                                                                              x = v[p];
    A seguinte implementação é um pouco melhor,                                               v[p] = v[f];
    porque faz menos trocas e executa a divisão f/2                                           v[f] = x;
    uma só vez:                                                                               p = f;
                                                                                              f = 2 * p;
    void peneira (int p, int m, int v[]) {                                                }
       int f = 2 * p;                                                                     else
       int x = v[p];                                                                      {
                                                                                              if((f < m) && (v[p] < v[f + 1])) {
             while(f <= m) {                                                                      x = v[p]
                if((f < m) && (v[f] < v[f + 1])) ++f;                                             v[p] = v[f + 1];
                if(x >= v[f]) break;                                                              v[f + 1] = x;
                v[p] = v[f];                                                                      p = f + 1;
                p = f;                                                                            f = 2 * p;
                f = 2 * p;                                                                    }
             }                                                                                else break;
             v[p] = x;                                                                    }
    }                                                                                   }
                                                                                    }
    2.1.1 A FUNÇÃO PENEIRA : DESEMPENHO
    A função peneira é muito rápida. O consumo de
    tempo é proporcional ao número de iterações, e
                                                                                2 Um algoritmo é correto se cumpre o prometido, ou seja, se
                                                                                faz o que promete fazer.


2
2.3 POR QUE UM HEAP É ÚTIL?                          2.4 O ALGORITMO HEAPSORT
    Por que um max-heap é uma estrutura de dados         Não é difícil juntar tudo que dissemos acima para
    tão poderosa? Suponha que v[1..m] é um max-          obter um algoritmo que coloque v[1..n] em ordem
    heap; então                                          crescente.

       a. a pergunta "qual o maior elemento de ve-       #include <>
          tor?" pode ser respondida instantanea-
          mente: o maior elemento do vetor é v[1];       void peneira (int p, int m, int v[]) {
       b. se o valor de v[1] for alterado, o max-heap       int f = 2 * p;
          pode ser restabelecido muito rapidamen-           int x = v[p];
          te: a operação peneira(1, m, v) não demo-
          ra mais que         para fazer o serviço;          while(f <= m) {
       c. um vetor v[1..m] arbitrário pode ser trans-           if((f < m) && (v[f] < v[f + 1])) ++f;
          formado em um max-heap muito rapida-                  if(x >= v[f]) break;
          mente: o comando                                      v[p] = v[f];
                                                                p = f;
           for(p = m/2; p >= 1; --p) peneira(p, m, v);          f = 2 * p;
                                                             }
           faz o serviço em tempo proporcional a m.          v[p] = x;
           (É fácil ver que o consumo de tempo é li-     }
           mitado por (         )⁄ , pois o tempo gas-
           to em cada uma das m/2 iterações é limi-      // Rearranja os elementos do vetor v[1..n]
           tado por        . É um pouco mais difícil     // de modo que fiquem em ordem crescente
           verificar que o tempo é, na verdade, limi-
           tado por m apenas.)                           void heapsort(int n, int v[]) {
                                                            int p, m, x;

    2.3.1 EXERCÍCIOS
                                                             // usa a função peneira para criar o heap
    1. Mostre que o fragmento de programa abaixo
                                                             printf(“Criando heap...nnn”);
       faz no máximo m comparações entre elemen-
                                                             for(p = n / 2; p >= 1; --p)
       tos do vetor.
                                                                peneira(p, n, v);

       for(p = m/2; p >= 1; --p) peneira(p, m, v);
                                                             printf(“Heap criadon”);
                                                             for(int i=0; i<n; i++) printf(“%d ”, v[i]);
    2. O fragmento de programa abaixo transforma
                                                             printf(“nn”);
       um vetor arbitrário v[1..m] em max-heap?
                                                           // usa a função peneira para ordenar o vetor
       for(p = 1; p <= m/2; ++p) peneira(p, m, v);
                                                           printf(“Ordenando vetor a partir do heap cria-
                                                         do...nnn”);
    3. Critique a seguinte ideia: para transformar
                                                           for(m = n; m >= 2; --m) {
       um vetor arbitrário em max-heap, basta colo-
                                                               x = v[1]
       cá-lo em ordem decrescente.
                                                               v[1] = v[m];
                                                               v[m] = x;
    4. Escreva uma função ff que receba um vetor v
                                                               peneira(1, m - 1, v);
       e um índice k tais que v[1..k - 1] é um max-
                                                           }
       heap e transforme v[1..k] em max-heap. Sua
                                                         }
       função deve fazer no máximo           compa-
       rações entre elementos do vetor. Agora use ff
       para construir uma função que transforme
       qualquer vetor v[1..m] em max-heap. Sua
       função deve fazer no máximo             com-
       parações entre elementos do vetor.




3
int main() {                                                                              2.5 UMA OLHADA NA IMPLEMENTAÇÃO
       int v[5] = {5, 2, 7, 10, 4};
       int i;                                                                                 DO ALGORITMO
                                                                                              Listagem 1:
            printf(“Vetor original:n”);                                                      void heapsort(tipo a[], int n) {
            for(i=0; i<5; i++) printf(“%d ”, v[i]);                                              int i = n / 2;
            printf(“nn”);                                                                      int pai, filho;
                                                                                                 tipo t;
            heapsort(5, v);
                                                                                                      for(;;) {
            printf(“Vetor ordenado:n”);                                                                 if(i > 0) {
            for(i=0; i<5; i++) printf(“%d ”, v[i]);                                                          i--; t = a[i];
            printf(“nn”);                                                                              }
                                                                                                         else {
            return 0;                                                                                        n--;
    }                                                                                                        if(n == 0) return;
                                                                                                             t = a[n]; a[n] = a[0];
    O primeiro comando for transforma o vetor em                                                         }
    um max-heap recorrendo cerca de n/2 vezes à                                                          pai = i;
    função peneira. Feito isso, temos um processo                                                        filho = i * 2 + 1;
    iterativo controlado pelo segundo comando for.
    No início de cada iteração valem os seguintes                                                             while(filho < n) {
    invariantes:                                                                                                 if((filho + 1 < n) && (a[filho + 1] > a[filho]))
                                                                                                                     filho++;
                  o vetor v[1..n] é uma permutação do vetor                                                     if(a[filho] > t) {
                   original,                                                                                         a[pai] = a[filho];
                  o vetor v[1..m] é um max-heap,                                                                    pai = filho;
                  v[1..m] ≤ v[m + 1..n] e                                                                           filho = pai * 2 + 1;
                  o vetor v[m + 1..n] está em ordem crescen-                                                    }
                   te.                                                                                           else break;
                                                                                                              }
    É claro que v[1..n] estará em ordem crescente                                                             a[pai] = t;
    quando m for igual a 1.                                                                           }
                                                                                              }
        1                    max-heap                   m               crescente       n
    888      777   666    555   444   333
                         elementos pequenos
                                            222   111   000   999    999   999   999
                                                                    elementos grandes
                                                                                        999
                                                                                              2.6 UM EXEMPLO ILUSTRADO
                                                                                              O segredo do funcionamento do algoritmo é uma
                                                                                              estrutura de dados conhecida como heap (= mon-
                                                                                              te). Um max-heap é um vetor v[1..m] tal que:

                                                                                                                                   v[f/2] ≥ v[f]

                                                                                              para f = 2, ..., m. Aqui, como no resto desta pági-
                                                                                              na, vamos convencionar que as expressões que
                                                                                              figuram como índices de um vetor são sempre
                                                                                              inteiras. Uma expressão da forma "f/2" significa
                                                                                              ⌊ f/2 ⌋, ou seja, o piso de f/2, isto é, a parte intei-
                                                                                              ra do quociente de f por 2.

                                                                                              Assim, se v[1..17] é um max-heap então, em par-
                                                                                              ticular, v[5] ≥ v[10] e v[5] ≥ v[11]:

                                                                                                  1       2    3   4   5   6   7     8   9   10   11   12   13   14   15   16   17
                                                                                              999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999




4
                                                                           3 TERMINAMOS
                      Estranha essa definição de max-
                      heap, não? Talvez a coisa fique mais
                      clara se encararmos a sequência de                        Terminamos por aqui.
                      índices 1..m como um árvore binária:
                                                                                Corra para o próximo tutorial.
             o índice 1 é a raiz da árvore;
             o pai de um índice f é f/2 (é claro que 1
              não tem pai);
             o filho esquerdo de um índice p é 2p e o fi-
              lho direito é 2p + 1 (é claro que o filho es-
              querdo só existe se 2p ≤ m e o filho direito
              só existe se 2p + 1 ≤ m).

    A figura abaixo procura desenhar um vetor
    v[1..55] de modo que cada filho fique na "cama-
    da" imediatamente inferior à do pai. O vetor é
    definido por v[i] = i e, portanto longe está de ser
    um max-heap. Observe que cada "camada", exce-
    to a última, tem duas vezes mais elementos que a
    "camada" anterior. Com isso, o número de "ca-
    madas" de v[1..m] é exatamente       ⌊      ⌋.

                                                         1
                                                     2       3
                                                4    5       6   7
                                          8   9 10 11 12 13 14 15
                              16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
      32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55




    Uma vez entendido o conceito de pai e filho, po-
    demos dizer que um vetor é um max-heap se o
    valor de todo pai é maior ou igual que o valor de
    qualquer de seus dois filhos (onde o valor de um
    índice p é v[p]).

    2.6.1 EXERCÍCIOS DE                  FIXAÇÃO
    1. O vetor abaixo é um max-heap?
       161 41 101 141 71 91 31 21 81 17 16

    2. Escreva uma função que decida se um vetor
       v[1..m] é ou não um max-heap.

    3. Escreva uma função que verifique se um vetor
       v[1..m] é ou não um max-heap máximo.

    4. Escreva uma função que verifique se um vetor
       v[1..m] é ou não um max-heap mínimo.

    2.7 COMPLEXIDADE
    Comparações no pior caso:                                        ( )

    Trocas no pior caso:                                 ( )

    Melhor e pior caso: (                        )




5

Contenu connexe

Tendances

Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsortFlávio Freitas
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2Leandro Lopes
 
Tutorial aed iii 002 - algoritmo de ordenação shellsort
Tutorial aed iii   002 - algoritmo de ordenação shellsortTutorial aed iii   002 - algoritmo de ordenação shellsort
Tutorial aed iii 002 - algoritmo de ordenação shellsortFlávio Freitas
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeRegis Magalhães
 
ShellSort - Ordenação
ShellSort - OrdenaçãoShellSort - Ordenação
ShellSort - OrdenaçãoAnderson Zardo
 
Aula 06 vetores e matrizes
Aula 06   vetores e matrizesAula 06   vetores e matrizes
Aula 06 vetores e matrizesTácito Graça
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
Algoritmos e Programação: Manipulação de strings
Algoritmos e Programação: Manipulação de stringsAlgoritmos e Programação: Manipulação de strings
Algoritmos e Programação: Manipulação de stringsAlex Camargo
 
Recursividade em C
Recursividade em CRecursividade em C
Recursividade em CCaique Silva
 
Complexidade de algoritmos insertion, selection e bubble sort.
Complexidade de algoritmos insertion, selection e bubble sort.Complexidade de algoritmos insertion, selection e bubble sort.
Complexidade de algoritmos insertion, selection e bubble sort.Júlio Rocha
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etcLuciano Ramalho
 
Tutorial aed iii 003 - algoritmo de ordenação shellsort
Tutorial aed iii   003 - algoritmo de ordenação shellsortTutorial aed iii   003 - algoritmo de ordenação shellsort
Tutorial aed iii 003 - algoritmo de ordenação shellsortFlávio Freitas
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursaosamuelthiago
 
Análise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoAnálise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoGustavo Carvalho
 

Tendances (18)

Tutorial aed iii 008 - algoritmo de ordenação heapsort
Tutorial aed iii   008 - algoritmo de ordenação heapsortTutorial aed iii   008 - algoritmo de ordenação heapsort
Tutorial aed iii 008 - algoritmo de ordenação heapsort
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
 
Tutorial aed iii 002 - algoritmo de ordenação shellsort
Tutorial aed iii   002 - algoritmo de ordenação shellsortTutorial aed iii   002 - algoritmo de ordenação shellsort
Tutorial aed iii 002 - algoritmo de ordenação shellsort
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
ShellSort - Ordenação
ShellSort - OrdenaçãoShellSort - Ordenação
ShellSort - Ordenação
 
Aula 06 vetores e matrizes
Aula 06   vetores e matrizesAula 06   vetores e matrizes
Aula 06 vetores e matrizes
 
Aula 01
Aula 01Aula 01
Aula 01
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Algoritmos e Programação: Manipulação de strings
Algoritmos e Programação: Manipulação de stringsAlgoritmos e Programação: Manipulação de strings
Algoritmos e Programação: Manipulação de strings
 
Recursividade em C
Recursividade em CRecursividade em C
Recursividade em C
 
Complexidade de algoritmos insertion, selection e bubble sort.
Complexidade de algoritmos insertion, selection e bubble sort.Complexidade de algoritmos insertion, selection e bubble sort.
Complexidade de algoritmos insertion, selection e bubble sort.
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
Tutorial aed iii 003 - algoritmo de ordenação shellsort
Tutorial aed iii   003 - algoritmo de ordenação shellsortTutorial aed iii   003 - algoritmo de ordenação shellsort
Tutorial aed iii 003 - algoritmo de ordenação shellsort
 
Algoritmo Shell Sort
Algoritmo Shell SortAlgoritmo Shell Sort
Algoritmo Shell Sort
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursao
 
Análise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoAnálise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenação
 

En vedette

Guia arduino iniciante multilogica ARDUINO
Guia arduino iniciante multilogica ARDUINOGuia arduino iniciante multilogica ARDUINO
Guia arduino iniciante multilogica ARDUINOChellton Almeida
 
Aprendendo a programar em arduino
Aprendendo a programar em arduinoAprendendo a programar em arduino
Aprendendo a programar em arduinoChellton Almeida
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPDaniel Brandão
 
PHP Aula 05 - E-mails, Cookies e Sessoes
PHP Aula 05 - E-mails, Cookies e SessoesPHP Aula 05 - E-mails, Cookies e Sessoes
PHP Aula 05 - E-mails, Cookies e SessoesDaniel Brandão
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosDaniel Brandão
 
Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosAula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosDaniel Brandão
 
Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)Chellton Almeida
 
Aula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisAula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisDaniel Brandão
 
Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Daniel Brandão
 
Curso avançado de c++ em portugues
Curso avançado de c++ em portuguesCurso avançado de c++ em portugues
Curso avançado de c++ em portuguesLaura
 
Apostila LINUX Básico
Apostila LINUX BásicoApostila LINUX Básico
Apostila LINUX BásicoFernando Palma
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaÁlvaro Farias Pinheiro
 

En vedette (20)

POO - 05 - Ambiente de Desenvolvimento
POO - 05 - Ambiente de DesenvolvimentoPOO - 05 - Ambiente de Desenvolvimento
POO - 05 - Ambiente de Desenvolvimento
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
Guia arduino iniciante multilogica ARDUINO
Guia arduino iniciante multilogica ARDUINOGuia arduino iniciante multilogica ARDUINO
Guia arduino iniciante multilogica ARDUINO
 
Aprendendo a programar em arduino
Aprendendo a programar em arduinoAprendendo a programar em arduino
Aprendendo a programar em arduino
 
Python Orientação a Objeto
Python Orientação a ObjetoPython Orientação a Objeto
Python Orientação a Objeto
 
Apostila java completo
Apostila java completoApostila java completo
Apostila java completo
 
Cartilhado arduino ed1
Cartilhado arduino ed1Cartilhado arduino ed1
Cartilhado arduino ed1
 
Aula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHPAula 02 - Introdução ao PHP
Aula 02 - Introdução ao PHP
 
PHP Aula 05 - E-mails, Cookies e Sessoes
PHP Aula 05 - E-mails, Cookies e SessoesPHP Aula 05 - E-mails, Cookies e Sessoes
PHP Aula 05 - E-mails, Cookies e Sessoes
 
Encapsulamento em Orientação a Objetos
Encapsulamento em Orientação a ObjetosEncapsulamento em Orientação a Objetos
Encapsulamento em Orientação a Objetos
 
Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosAula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
 
Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)
 
Programação Estruturada e Orientada a Objetos
Programação Estruturada e Orientada a ObjetosProgramação Estruturada e Orientada a Objetos
Programação Estruturada e Orientada a Objetos
 
Aula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisAula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas Condicionais
 
Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)Aula 02 - Principios da Orientação a Objetos (POO)
Aula 02 - Principios da Orientação a Objetos (POO)
 
Curso avançado de c++ em portugues
Curso avançado de c++ em portuguesCurso avançado de c++ em portugues
Curso avançado de c++ em portugues
 
JAVA - Orientação a Objetos
JAVA - Orientação a ObjetosJAVA - Orientação a Objetos
JAVA - Orientação a Objetos
 
Apostila LINUX Básico
Apostila LINUX BásicoApostila LINUX Básico
Apostila LINUX Básico
 
2672853-apostila-completa-de-Java
2672853-apostila-completa-de-Java2672853-apostila-completa-de-Java
2672853-apostila-completa-de-Java
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com Java
 

Similaire à Algoritmo heapsort em C

Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Thaci Santos
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação FuncionalLambda 3
 
Curso de Shell Script 10/11
Curso de Shell Script 10/11Curso de Shell Script 10/11
Curso de Shell Script 10/11Rodrigo Silva
 
Curso de ShellScript - Lm10 shellscript10
Curso de ShellScript - Lm10 shellscript10Curso de ShellScript - Lm10 shellscript10
Curso de ShellScript - Lm10 shellscript10Pessoal
 
Matlab – curso básico (1)
Matlab – curso básico (1)Matlab – curso básico (1)
Matlab – curso básico (1)Felipe Meganha
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem CLeonardo Lima
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04thomasdacosta
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dadosgjpbg
 
Curso de ShellScript - Lm05 shellscript5
Curso de ShellScript - Lm05 shellscript5Curso de ShellScript - Lm05 shellscript5
Curso de ShellScript - Lm05 shellscript5Pessoal
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturadadiogoa21
 

Similaire à Algoritmo heapsort em C (20)

Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.
 
Algoritmo0
Algoritmo0Algoritmo0
Algoritmo0
 
Usando o winplot
Usando o winplotUsando o winplot
Usando o winplot
 
Haskell
HaskellHaskell
Haskell
 
Pged 07
Pged 07Pged 07
Pged 07
 
Técnicas de Programação Funcional
Técnicas de Programação FuncionalTécnicas de Programação Funcional
Técnicas de Programação Funcional
 
Curso de Shell Script 10/11
Curso de Shell Script 10/11Curso de Shell Script 10/11
Curso de Shell Script 10/11
 
Curso de ShellScript - Lm10 shellscript10
Curso de ShellScript - Lm10 shellscript10Curso de ShellScript - Lm10 shellscript10
Curso de ShellScript - Lm10 shellscript10
 
10-Matlab.pdf
10-Matlab.pdf10-Matlab.pdf
10-Matlab.pdf
 
Matlab – curso básico (1)
Matlab – curso básico (1)Matlab – curso básico (1)
Matlab – curso básico (1)
 
Aula4
Aula4Aula4
Aula4
 
Matlab
Matlab Matlab
Matlab
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Aula 01
Aula 01Aula 01
Aula 01
 
Curso de ShellScript - Lm05 shellscript5
Curso de ShellScript - Lm05 shellscript5Curso de ShellScript - Lm05 shellscript5
Curso de ShellScript - Lm05 shellscript5
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 

Plus de Flávio Freitas

5º apl cursos técnicos - informática básica e aplicada 2012 - br office.org...
5º apl   cursos técnicos - informática básica e aplicada 2012 - br office.org...5º apl   cursos técnicos - informática básica e aplicada 2012 - br office.org...
5º apl cursos técnicos - informática básica e aplicada 2012 - br office.org...Flávio Freitas
 
5º apl cursos técnicos - informática básica e aplicada 2012 - br office.org...
5º apl   cursos técnicos - informática básica e aplicada 2012 - br office.org...5º apl   cursos técnicos - informática básica e aplicada 2012 - br office.org...
5º apl cursos técnicos - informática básica e aplicada 2012 - br office.org...Flávio Freitas
 
Tutorial dev cpp 001 - criação, leitura e alteração de arquivos
Tutorial dev cpp   001 - criação, leitura e alteração de arquivosTutorial dev cpp   001 - criação, leitura e alteração de arquivos
Tutorial dev cpp 001 - criação, leitura e alteração de arquivosFlávio Freitas
 
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
Tutorial dev cpp   002 - criação, leitura e alteração de arquivosTutorial dev cpp   002 - criação, leitura e alteração de arquivos
Tutorial dev cpp 002 - criação, leitura e alteração de arquivosFlávio Freitas
 
Aula 001 histórico dos computadores
Aula 001   histórico dos computadoresAula 001   histórico dos computadores
Aula 001 histórico dos computadoresFlávio Freitas
 
Aula 004 noções de hardware
Aula 004   noções de hardwareAula 004   noções de hardware
Aula 004 noções de hardwareFlávio Freitas
 
Aula 005 noções de hardware
Aula 005   noções de hardwareAula 005   noções de hardware
Aula 005 noções de hardwareFlávio Freitas
 
Aula 001 plan. e sist. comp. aplic. à adm. - o computador na sociedade, nas...
Aula 001   plan. e sist. comp. aplic. à adm. - o computador na sociedade, nas...Aula 001   plan. e sist. comp. aplic. à adm. - o computador na sociedade, nas...
Aula 001 plan. e sist. comp. aplic. à adm. - o computador na sociedade, nas...Flávio Freitas
 
Aula 003 plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
Aula 003   plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...Aula 003   plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
Aula 003 plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...Flávio Freitas
 
Aula 004 plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
Aula 004   plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...Aula 004   plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
Aula 004 plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...Flávio Freitas
 
Solução dos exercícios do livro Algoritmos e Estruturas de Dados dos autores ...
Solução dos exercícios do livro Algoritmos e Estruturas de Dados dos autores ...Solução dos exercícios do livro Algoritmos e Estruturas de Dados dos autores ...
Solução dos exercícios do livro Algoritmos e Estruturas de Dados dos autores ...Flávio Freitas
 
Algoritmos para estruturas de dados
Algoritmos para estruturas de dadosAlgoritmos para estruturas de dados
Algoritmos para estruturas de dadosFlávio Freitas
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenaçãoFlávio Freitas
 
Matemática computacional aula 002
Matemática computacional   aula 002Matemática computacional   aula 002
Matemática computacional aula 002Flávio Freitas
 
Matemática computacional aula 001
Matemática computacional   aula 001Matemática computacional   aula 001
Matemática computacional aula 001Flávio Freitas
 

Plus de Flávio Freitas (15)

5º apl cursos técnicos - informática básica e aplicada 2012 - br office.org...
5º apl   cursos técnicos - informática básica e aplicada 2012 - br office.org...5º apl   cursos técnicos - informática básica e aplicada 2012 - br office.org...
5º apl cursos técnicos - informática básica e aplicada 2012 - br office.org...
 
5º apl cursos técnicos - informática básica e aplicada 2012 - br office.org...
5º apl   cursos técnicos - informática básica e aplicada 2012 - br office.org...5º apl   cursos técnicos - informática básica e aplicada 2012 - br office.org...
5º apl cursos técnicos - informática básica e aplicada 2012 - br office.org...
 
Tutorial dev cpp 001 - criação, leitura e alteração de arquivos
Tutorial dev cpp   001 - criação, leitura e alteração de arquivosTutorial dev cpp   001 - criação, leitura e alteração de arquivos
Tutorial dev cpp 001 - criação, leitura e alteração de arquivos
 
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
Tutorial dev cpp   002 - criação, leitura e alteração de arquivosTutorial dev cpp   002 - criação, leitura e alteração de arquivos
Tutorial dev cpp 002 - criação, leitura e alteração de arquivos
 
Aula 001 histórico dos computadores
Aula 001   histórico dos computadoresAula 001   histórico dos computadores
Aula 001 histórico dos computadores
 
Aula 004 noções de hardware
Aula 004   noções de hardwareAula 004   noções de hardware
Aula 004 noções de hardware
 
Aula 005 noções de hardware
Aula 005   noções de hardwareAula 005   noções de hardware
Aula 005 noções de hardware
 
Aula 001 plan. e sist. comp. aplic. à adm. - o computador na sociedade, nas...
Aula 001   plan. e sist. comp. aplic. à adm. - o computador na sociedade, nas...Aula 001   plan. e sist. comp. aplic. à adm. - o computador na sociedade, nas...
Aula 001 plan. e sist. comp. aplic. à adm. - o computador na sociedade, nas...
 
Aula 003 plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
Aula 003   plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...Aula 003   plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
Aula 003 plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
 
Aula 004 plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
Aula 004   plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...Aula 004   plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
Aula 004 plan. e sist. comp. aplic. à adm. - estudos dos principais sistema...
 
Solução dos exercícios do livro Algoritmos e Estruturas de Dados dos autores ...
Solução dos exercícios do livro Algoritmos e Estruturas de Dados dos autores ...Solução dos exercícios do livro Algoritmos e Estruturas de Dados dos autores ...
Solução dos exercícios do livro Algoritmos e Estruturas de Dados dos autores ...
 
Algoritmos para estruturas de dados
Algoritmos para estruturas de dadosAlgoritmos para estruturas de dados
Algoritmos para estruturas de dados
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
Matemática computacional aula 002
Matemática computacional   aula 002Matemática computacional   aula 002
Matemática computacional aula 002
 
Matemática computacional aula 001
Matemática computacional   aula 001Matemática computacional   aula 001
Matemática computacional aula 001
 

Dernier

Cultura e Sociedade - Texto de Apoio.pdf
Cultura e Sociedade - Texto de Apoio.pdfCultura e Sociedade - Texto de Apoio.pdf
Cultura e Sociedade - Texto de Apoio.pdfaulasgege
 
Guia completo da Previdênci a - Reforma .pdf
Guia completo da Previdênci a - Reforma .pdfGuia completo da Previdênci a - Reforma .pdf
Guia completo da Previdênci a - Reforma .pdfEyshilaKelly1
 
William J. Bennett - O livro das virtudes para Crianças.pdf
William J. Bennett - O livro das virtudes para Crianças.pdfWilliam J. Bennett - O livro das virtudes para Crianças.pdf
William J. Bennett - O livro das virtudes para Crianças.pdfAdrianaCunha84
 
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASBCRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASBAline Santana
 
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptxSlides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptxLuizHenriquedeAlmeid6
 
Bullying - Atividade com caça- palavras
Bullying   - Atividade com  caça- palavrasBullying   - Atividade com  caça- palavras
Bullying - Atividade com caça- palavrasMary Alvarenga
 
Bullying - Texto e cruzadinha
Bullying        -     Texto e cruzadinhaBullying        -     Texto e cruzadinha
Bullying - Texto e cruzadinhaMary Alvarenga
 
Modelos de Desenvolvimento Motor - Gallahue, Newell e Tani
Modelos de Desenvolvimento Motor - Gallahue, Newell e TaniModelos de Desenvolvimento Motor - Gallahue, Newell e Tani
Modelos de Desenvolvimento Motor - Gallahue, Newell e TaniCassio Meira Jr.
 
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃOLEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃOColégio Santa Teresinha
 
Lírica Camoniana- A mudança na lírica de Camões.pptx
Lírica Camoniana- A mudança na lírica de Camões.pptxLírica Camoniana- A mudança na lírica de Camões.pptx
Lírica Camoniana- A mudança na lírica de Camões.pptxfabiolalopesmartins1
 
Sociologia Contemporânea - Uma Abordagem dos principais autores
Sociologia Contemporânea - Uma Abordagem dos principais autoresSociologia Contemporânea - Uma Abordagem dos principais autores
Sociologia Contemporânea - Uma Abordagem dos principais autoresaulasgege
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasCassio Meira Jr.
 
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasCenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasRosalina Simão Nunes
 
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMCOMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMVanessaCavalcante37
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxkarinedarozabatista
 
Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.keislayyovera123
 
ALMANANHE DE BRINCADEIRAS - 500 atividades escolares
ALMANANHE DE BRINCADEIRAS - 500 atividades escolaresALMANANHE DE BRINCADEIRAS - 500 atividades escolares
ALMANANHE DE BRINCADEIRAS - 500 atividades escolaresLilianPiola
 
Aula - 1º Ano - Émile Durkheim - Um dos clássicos da sociologia
Aula - 1º Ano - Émile Durkheim - Um dos clássicos da sociologiaAula - 1º Ano - Émile Durkheim - Um dos clássicos da sociologia
Aula - 1º Ano - Émile Durkheim - Um dos clássicos da sociologiaaulasgege
 

Dernier (20)

Cultura e Sociedade - Texto de Apoio.pdf
Cultura e Sociedade - Texto de Apoio.pdfCultura e Sociedade - Texto de Apoio.pdf
Cultura e Sociedade - Texto de Apoio.pdf
 
Guia completo da Previdênci a - Reforma .pdf
Guia completo da Previdênci a - Reforma .pdfGuia completo da Previdênci a - Reforma .pdf
Guia completo da Previdênci a - Reforma .pdf
 
William J. Bennett - O livro das virtudes para Crianças.pdf
William J. Bennett - O livro das virtudes para Crianças.pdfWilliam J. Bennett - O livro das virtudes para Crianças.pdf
William J. Bennett - O livro das virtudes para Crianças.pdf
 
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASBCRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
CRÔNICAS DE UMA TURMA - TURMA DE 9ºANO - EASB
 
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptxSlides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
Slides Lição 4, CPAD, Como se Conduzir na Caminhada, 2Tr24.pptx
 
Bullying - Atividade com caça- palavras
Bullying   - Atividade com  caça- palavrasBullying   - Atividade com  caça- palavras
Bullying - Atividade com caça- palavras
 
Bullying - Texto e cruzadinha
Bullying        -     Texto e cruzadinhaBullying        -     Texto e cruzadinha
Bullying - Texto e cruzadinha
 
Modelos de Desenvolvimento Motor - Gallahue, Newell e Tani
Modelos de Desenvolvimento Motor - Gallahue, Newell e TaniModelos de Desenvolvimento Motor - Gallahue, Newell e Tani
Modelos de Desenvolvimento Motor - Gallahue, Newell e Tani
 
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃOLEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
LEMBRANDO A MORTE E CELEBRANDO A RESSUREIÇÃO
 
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA -
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA      -XI OLIMPÍADAS DA LÍNGUA PORTUGUESA      -
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA -
 
Lírica Camoniana- A mudança na lírica de Camões.pptx
Lírica Camoniana- A mudança na lírica de Camões.pptxLírica Camoniana- A mudança na lírica de Camões.pptx
Lírica Camoniana- A mudança na lírica de Camões.pptx
 
Sociologia Contemporânea - Uma Abordagem dos principais autores
Sociologia Contemporânea - Uma Abordagem dos principais autoresSociologia Contemporânea - Uma Abordagem dos principais autores
Sociologia Contemporânea - Uma Abordagem dos principais autores
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades Motoras
 
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
Orientação Técnico-Pedagógica EMBcae Nº 001, de 16 de abril de 2024
 
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasCenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
 
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEMCOMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
COMPETÊNCIA 1 DA REDAÇÃO DO ENEM - REDAÇÃO ENEM
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
 
Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.Época Realista y la obra de Madame Bovary.
Época Realista y la obra de Madame Bovary.
 
ALMANANHE DE BRINCADEIRAS - 500 atividades escolares
ALMANANHE DE BRINCADEIRAS - 500 atividades escolaresALMANANHE DE BRINCADEIRAS - 500 atividades escolares
ALMANANHE DE BRINCADEIRAS - 500 atividades escolares
 
Aula - 1º Ano - Émile Durkheim - Um dos clássicos da sociologia
Aula - 1º Ano - Émile Durkheim - Um dos clássicos da sociologiaAula - 1º Ano - Émile Durkheim - Um dos clássicos da sociologia
Aula - 1º Ano - Émile Durkheim - Um dos clássicos da sociologia
 

Algoritmo heapsort em C

  • 1. ALGORITMOS E ESTRUTURAS DE DADOS III Tutorial 7 (usa o compilador de linguagem C Dev-C++ versão 4.9.9.2) Parte 1 de 3 sobre o algoritmo de ordenação heap (monte) conhecido como Heapsort.
  • 2. Tem um desempenho em tempo de execução 1 INTRODUÇÃO muito bom em conjuntos ordenados aleatoria- mente, tem um uso de memória bem comportado Esta série de tutoriais sobre Algoritmos e Estrutu- e o seu desempenho em pior cenário é pratica- ras de Dados III foi escrita usando o Microsoft mente igual ao desempenho em cenário médio. Windows 7 Ultimate, Microsoft Office 2010, Alguns algoritmos de ordenação rápidos têm de- Bloodshed Dev-C++ versão 4.9.9.2 (pode ser bai- sempenhos espetacularmente ruins no pior cená- xado em http://www.bloodshed.net), referências rio, quer em tempo de execução, quer no uso da na internet e notas de aula do professor quando memória. O Heapsort trabalha no lugar e o tempo estudante. Ela cobre desde os algoritmos de or- de execução em pior cenário para ordenar n ele- denação, passando pela pesquisa em memória mentos é de ( ). Para valores de n, razoa- primária e culminando com a pesquisa em me- velmente grande, o termo é quase constan- mória secundária. te, de modo que o tempo de ordenação é quase linear com o número de itens a ordenar. Nós entendemos que você já conhece o compila- dor Dev-C++. No caso de você ainda não o conhe- cer, dê uma olhada nos tutoriais Dev-C++ 001 a 2.1 UMA OLHADA NO FUNCIONAMENTO 017, começando pelo Tutorial Dev-C++ - 001 - DO ALGORITMO Introdução. O Heapsort utiliza uma estrutura de dados cha- Se não tem problemas com a linguagem C/C++ e mada heap, para ordenar os elementos a medida o compilador Dev-C++, então o próximo passo é que os insere na estrutura. Assim, ao final das saber ler, criar e alterar arquivos em disco usan- inserções, os elementos podem ser sucessiva- do linguagem C/C++. Se ainda não sabe como mente removidos da raiz da heap, na ordem dese- fazê-lo, dê uma olhada nos tutoriais Dev-C++ 001 jada, lembrando-se sempre de manter a proprie- e 002, começando pelo Tutorial Dev-C++ 001 – dade de max-heap. Criação, Leitura e Alteração de Arquivos. A heap pode ser representada como uma árvore Se sabe todas as coisas anteriores, então a pró- (uma árvore binária com propriedades especiais 1) xima etapa é conhecer os algoritmos mais básicos ou como um vetor. Para uma ordenação crescen- de ordenação. Em minhas notas de aula você te, deve ser construído um heap máximo (o maior encontra um material básico, porém detalhado e elemento fica na raiz, isto é, primeiro elemento do com algoritmos resolvidos, dos principais méto- vetor). Para uma ordenação decrescente, deve ser dos de ordenação existentes. construído um heap mínimo (o menor elemento fica na raiz). Adotaremos o livro Projeto de Algoritmos com Implementação em Pascal e C, Editora Cengage 2.1 A FUNÇÃO PENEIRA Learning, de Nivio Ziviani, como livro-texto da disciplina. Nele você encontrará os métodos de O coração de qualquer algoritmo que manipule ordenação que iremos estudar. um max-heap é uma função que recebe um vetor arbitrário v[1..m] e um índice p e faz v[p] "descer" Seu próximo passo será estudar os algoritmos de para sua posição "correta". ordenação por Inserção, Seleção, Shellsort e Quicksort. Você pode usar os links anteriores Como se faz isso? A ideia é óbvia. Se v[p] ≥ v[2p] e (em inglês) ou fazer uso do livro-texto. v[p] ≥ v[2p + 1] então não é preciso fazer nada. Se v[p] < v[2p] e v[2p] ≥ v[2p + 1] então basta trocar Se você seguiu todos os passos até aqui, está v[p] com v[2p] e depois fazer v[2p] "descer" para pronto para prosseguir com este tutorial. sua posição "correta". Não é difícil imaginar o que se deve fazer no terceiro caso. 2 O ALGORITMO DE ORDENAÇÃO Eis um exemplo com p = 1. Cada linha da tabela HEAPSORT é uma "foto" do vetor no início de uma iteração. O algoritmo Heapsort é um algoritmo de ordena- ção generalista, e faz parte da família de algorit- mos de ordenação por seleção. Foi desenvolvido em 1964 por Robert W. Floyd e J.W.J. Williams. 1 BAASE, Sara. Computer Algorithms: Introduction to Design and Analysis (em inglês). 2a ed. Reading, Massachu- setts: Addison-Wesley, 1988. 71 p. ISBN 0-201-06035-3 1
  • 3. 85 99 98 97 96 95 94 93 92 91 90 89 87 86 esse número não passa de , pois o valor de f pelo menos dobra a cada iteração. 99 85 98 97 96 95 94 93 92 91 90 89 87 86 2.2 EXERCÍCIOS 99 97 98 85 96 95 94 93 92 91 90 89 87 86 1. A seguinte alternativa para a função peneira 99 97 98 93 96 95 94 85 92 91 90 89 87 86 funciona corretamente2? void peneira (int p, int m, int v[]) { Eis uma função iterativa que faz o serviço. A va- int x; riável f é sempre um filho de p; no início de cada int f; iteração, f é ajustado de modo a ser o filho de maior valor de p. for(f = 2 * p; f <= m; f *= 2) { if((f < m) && (v[f] < v[f + 1])) ++f; // Recebe p em 1..m e rearranja o vetor v[1..m] p = f / 2; if(v[p] >= v[f]) break; // de modo que o "subvetor" cuja raiz é p seja // um max-heap. x = v[p]; v[p] = v[f]; // Supõe que os "subvetores" cujas raízes são v[f] = x; // filhos de p já são max-heaps. } } void peneira (int p, int m, int v[]) { int f = 2 * p; 2. Escreva uma versão recursiva da função pe- int x; neira. while(f <= m) { 3. Por que a seguinte implementação de peneira if((f < m) && (v[f] < v[f + 1])) ++f; não funciona? // f é o filho "mais valioso" de p if (v[f / 2] >= v[f]) break; void peneira (int p, int m, int v[]) { x = v[f / 2]; int x; v[f / 2] = v[f]; int f = 2 * p; v[f] = x; f *= 2; while(f <= m) { } if(v[p] < v[f]) { } x = v[p]; A seguinte implementação é um pouco melhor, v[p] = v[f]; porque faz menos trocas e executa a divisão f/2 v[f] = x; uma só vez: p = f; f = 2 * p; void peneira (int p, int m, int v[]) { } int f = 2 * p; else int x = v[p]; { if((f < m) && (v[p] < v[f + 1])) { while(f <= m) { x = v[p] if((f < m) && (v[f] < v[f + 1])) ++f; v[p] = v[f + 1]; if(x >= v[f]) break; v[f + 1] = x; v[p] = v[f]; p = f + 1; p = f; f = 2 * p; f = 2 * p; } } else break; v[p] = x; } } } } 2.1.1 A FUNÇÃO PENEIRA : DESEMPENHO A função peneira é muito rápida. O consumo de tempo é proporcional ao número de iterações, e 2 Um algoritmo é correto se cumpre o prometido, ou seja, se faz o que promete fazer. 2
  • 4. 2.3 POR QUE UM HEAP É ÚTIL? 2.4 O ALGORITMO HEAPSORT Por que um max-heap é uma estrutura de dados Não é difícil juntar tudo que dissemos acima para tão poderosa? Suponha que v[1..m] é um max- obter um algoritmo que coloque v[1..n] em ordem heap; então crescente. a. a pergunta "qual o maior elemento de ve- #include <> tor?" pode ser respondida instantanea- mente: o maior elemento do vetor é v[1]; void peneira (int p, int m, int v[]) { b. se o valor de v[1] for alterado, o max-heap int f = 2 * p; pode ser restabelecido muito rapidamen- int x = v[p]; te: a operação peneira(1, m, v) não demo- ra mais que para fazer o serviço; while(f <= m) { c. um vetor v[1..m] arbitrário pode ser trans- if((f < m) && (v[f] < v[f + 1])) ++f; formado em um max-heap muito rapida- if(x >= v[f]) break; mente: o comando v[p] = v[f]; p = f; for(p = m/2; p >= 1; --p) peneira(p, m, v); f = 2 * p; } faz o serviço em tempo proporcional a m. v[p] = x; (É fácil ver que o consumo de tempo é li- } mitado por ( )⁄ , pois o tempo gas- to em cada uma das m/2 iterações é limi- // Rearranja os elementos do vetor v[1..n] tado por . É um pouco mais difícil // de modo que fiquem em ordem crescente verificar que o tempo é, na verdade, limi- tado por m apenas.) void heapsort(int n, int v[]) { int p, m, x; 2.3.1 EXERCÍCIOS // usa a função peneira para criar o heap 1. Mostre que o fragmento de programa abaixo printf(“Criando heap...nnn”); faz no máximo m comparações entre elemen- for(p = n / 2; p >= 1; --p) tos do vetor. peneira(p, n, v); for(p = m/2; p >= 1; --p) peneira(p, m, v); printf(“Heap criadon”); for(int i=0; i<n; i++) printf(“%d ”, v[i]); 2. O fragmento de programa abaixo transforma printf(“nn”); um vetor arbitrário v[1..m] em max-heap? // usa a função peneira para ordenar o vetor for(p = 1; p <= m/2; ++p) peneira(p, m, v); printf(“Ordenando vetor a partir do heap cria- do...nnn”); 3. Critique a seguinte ideia: para transformar for(m = n; m >= 2; --m) { um vetor arbitrário em max-heap, basta colo- x = v[1] cá-lo em ordem decrescente. v[1] = v[m]; v[m] = x; 4. Escreva uma função ff que receba um vetor v peneira(1, m - 1, v); e um índice k tais que v[1..k - 1] é um max- } heap e transforme v[1..k] em max-heap. Sua } função deve fazer no máximo compa- rações entre elementos do vetor. Agora use ff para construir uma função que transforme qualquer vetor v[1..m] em max-heap. Sua função deve fazer no máximo com- parações entre elementos do vetor. 3
  • 5. int main() { 2.5 UMA OLHADA NA IMPLEMENTAÇÃO int v[5] = {5, 2, 7, 10, 4}; int i; DO ALGORITMO Listagem 1: printf(“Vetor original:n”); void heapsort(tipo a[], int n) { for(i=0; i<5; i++) printf(“%d ”, v[i]); int i = n / 2; printf(“nn”); int pai, filho; tipo t; heapsort(5, v); for(;;) { printf(“Vetor ordenado:n”); if(i > 0) { for(i=0; i<5; i++) printf(“%d ”, v[i]); i--; t = a[i]; printf(“nn”); } else { return 0; n--; } if(n == 0) return; t = a[n]; a[n] = a[0]; O primeiro comando for transforma o vetor em } um max-heap recorrendo cerca de n/2 vezes à pai = i; função peneira. Feito isso, temos um processo filho = i * 2 + 1; iterativo controlado pelo segundo comando for. No início de cada iteração valem os seguintes while(filho < n) { invariantes: if((filho + 1 < n) && (a[filho + 1] > a[filho])) filho++;  o vetor v[1..n] é uma permutação do vetor if(a[filho] > t) { original, a[pai] = a[filho];  o vetor v[1..m] é um max-heap, pai = filho;  v[1..m] ≤ v[m + 1..n] e filho = pai * 2 + 1;  o vetor v[m + 1..n] está em ordem crescen- } te. else break; } É claro que v[1..n] estará em ordem crescente a[pai] = t; quando m for igual a 1. } } 1 max-heap m crescente n 888 777 666 555 444 333 elementos pequenos 222 111 000 999 999 999 999 elementos grandes 999 2.6 UM EXEMPLO ILUSTRADO O segredo do funcionamento do algoritmo é uma estrutura de dados conhecida como heap (= mon- te). Um max-heap é um vetor v[1..m] tal que: v[f/2] ≥ v[f] para f = 2, ..., m. Aqui, como no resto desta pági- na, vamos convencionar que as expressões que figuram como índices de um vetor são sempre inteiras. Uma expressão da forma "f/2" significa ⌊ f/2 ⌋, ou seja, o piso de f/2, isto é, a parte intei- ra do quociente de f por 2. Assim, se v[1..17] é um max-heap então, em par- ticular, v[5] ≥ v[10] e v[5] ≥ v[11]: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 4
  • 6. 3 TERMINAMOS Estranha essa definição de max- heap, não? Talvez a coisa fique mais clara se encararmos a sequência de Terminamos por aqui. índices 1..m como um árvore binária: Corra para o próximo tutorial.  o índice 1 é a raiz da árvore;  o pai de um índice f é f/2 (é claro que 1 não tem pai);  o filho esquerdo de um índice p é 2p e o fi- lho direito é 2p + 1 (é claro que o filho es- querdo só existe se 2p ≤ m e o filho direito só existe se 2p + 1 ≤ m). A figura abaixo procura desenhar um vetor v[1..55] de modo que cada filho fique na "cama- da" imediatamente inferior à do pai. O vetor é definido por v[i] = i e, portanto longe está de ser um max-heap. Observe que cada "camada", exce- to a última, tem duas vezes mais elementos que a "camada" anterior. Com isso, o número de "ca- madas" de v[1..m] é exatamente ⌊ ⌋. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 Uma vez entendido o conceito de pai e filho, po- demos dizer que um vetor é um max-heap se o valor de todo pai é maior ou igual que o valor de qualquer de seus dois filhos (onde o valor de um índice p é v[p]). 2.6.1 EXERCÍCIOS DE FIXAÇÃO 1. O vetor abaixo é um max-heap? 161 41 101 141 71 91 31 21 81 17 16 2. Escreva uma função que decida se um vetor v[1..m] é ou não um max-heap. 3. Escreva uma função que verifique se um vetor v[1..m] é ou não um max-heap máximo. 4. Escreva uma função que verifique se um vetor v[1..m] é ou não um max-heap mínimo. 2.7 COMPLEXIDADE Comparações no pior caso: ( ) Trocas no pior caso: ( ) Melhor e pior caso: ( ) 5