SlideShare ist ein Scribd-Unternehmen logo
1 von 7
Downloaden Sie, um offline zu lesen
ALGORITMOS E ESTRUTURAS DE DADOS III
                                     Tutorial 4 (usa o compilador de linguagem C Dev-C++ versão 4.9.9.2)




Parte 1 de 3 sobre o algoritmo de ordenação quick (rápido) conhecido como Quicksort.
O algoritmo Quicksort pode ser dividido nos
    1 INTRODUÇÃO                                        seguintes passos:

    Esta série de tutoriais sobre Algoritmos e          1. O array A[p..r] é subdividido em dois arrays
    Estruturas de Dados III foi escrita usando o           A[p..q] e A[q+1..r] não vazios tal que cada
    Microsoft Windows 7 Ultimate, Microsoft                elemento de A[p..q] é menor ou igual a cada
    Office 2010, Bloodshed Dev-C++ versão 4.9.9.2          elemento de A[q+1..r]. O índice q é calculado
    (pode ser baixado em http://www.bloodshed.net),        como parte deste particionamento.
    referências na internet e notas de aula do          2. Os dois subarrays A[p..q] e A[q+1..r] são
    professor quando estudante. Ela cobre desde os         ordenados por recursivas chamadas do
    algoritmos de ordenação, passando pela pesquisa        Quicksort.
    em memória primária e culminando com a
    pesquisa em memória secundária.                     Por exemplo, dado o array f e d h a c g b, e
                                                        tomando o valor “d” para partição, o primeiro
    Nós entendemos que você já conhece o                passo do Quicksort rearranja o array da seguinte
    compilador Dev-C++. No caso de você ainda não o     forma:
    conhecer, dê uma olhada nos tutoriais Dev-C++
    001 a 017, começando pelo Tutorial Dev-C++ -        Início:      fedhacgb
                                                                  Antes f e e são maiores que d e estão à sua esquerda;
    001 - Introdução.
                                                                       a, c e b são menores que d e estão à sua direita.

    Se não tem problemas com a linguagem C/C++ e
                                                        Passo 1: b c a d h e g f
    o compilador Dev-C++, então o próximo passo é           Agora b, c e a são menores que d e estão à sua esquerda;
    saber ler, criar e alterar arquivos em disco                   h, e, g e f são maiores que d e estão à sua direita.
    usando linguagem C/C++. Se ainda não sabe
    como fazê-lo, dê uma olhada nos tutoriais Dev-      Esse processo é então repetido para cada seção –
    C++ 001 e 002, começando pelo Tutorial Dev-C++      isto é, “b c a” e “h e g f”.
    001 – Criação, Leitura e Alteração de Arquivos.
                                                        A vantagem é a não utilização de memória
    Se sabe todas as coisas anteriores, então a         auxiliar.
    próxima etapa é conhecer os algoritmos mais
    básicos de ordenação. Em minhas notas de aula       2.1 UMA OLHADA NO FUNCIONAMENTO
    você encontra um material básico, porém             DO ALGORITMO
    detalhado e com algoritmos resolvidos, dos
    principais métodos de ordenação existentes.         Essa     implementação      seleciona    o   valor
                                                        intermediário para particionar o array (elemento
    Adotaremos o livro Projeto de Algoritmos com        pivot). Para uma ordenação ótima, deveria ser
    Implementação em Pascal e C, Editora Cengage        selecionado o valor que estivesse precisamente no
    Learning, de Nivio Ziviani, como livro-texto da     centro da faixa de valores. Porém, isso não é fácil
    disciplina. Nele você encontrará os métodos de      para a maioria do conjunto de dados.
    ordenação que iremos estudar.

    Seu próximo passo será estudar os algoritmos de
    ordenação por Inserção, Seleção e Shellsort.
    Você pode usar os links anteriores (em inglês) ou
    fazer uso do livro-texto.

    Se você seguiu todos os passos até aqui, está
    pronto para prosseguir com este tutorial.


    2 O ALGORITMO DE ORDENAÇÃO
    QUICKSORT
    O Quicksort, como o Mergesort, é baseado em
    uma estratégia de dividir para conquistar e é um
    dos algoritmos de ordenação mais populares. O
    Quicksort é baseado no método de ordenação por
    trocas.


1
Listagem 1:                                                      muito rápido [Cormen, 2002] 2, por isso o nome,
    void qs(int *A, int esquerda, int direita) {                     Ordenação-Rápida (ou Quicksort em inglês).
       register int i, j;
       int x, y;

        i = esquerda;
        j = direita;
        // Elemento intermediário como “pivot”
        x = A[(esquerda + direita) / 2];

        do {
           while((A[i] < x) && (i < direita)) i++;
           while((A[j] > x) && (j > esquerda)) j--;
           if(i <= j){                                                   A figura mostra um gráfico do comportamento do Quicksort no pior caso.
                                                                                            Eixo Vertical: segundos de 0 à 11
              swap(A, i, j);                                                  Eixo Horizontal: número de elementos de 100.000 à 2.000.000.
              i++;
              j--;                                                   Desde que a partição custa uma recorrência,
           }                                                         neste caso torna-se
        } while(i <= j);
                                                                                             ( )         (           )           ( )
        if(esquerda < j) qs(A, esquerda, j);
                                                                     e como ( )              ( ) não é difícil mostrar que
        if(i < direita) qs(A, i, direita);
    }                                                                                               ( )          (       )

    A figura abaixo ilustra o funcionamento do                       Se a partição gera dois subconjuntos de tamanho
    Quicksort (parte em vermelho da listagem 1):                     n/2 temos a recorrência

                                                                                            ( )              ( )                 ( )

                                                                     que pelo teorema master nos dá

                                                                                                   ( )       (               )

                                                                     Pode ser mostrado que o caso médio do
                                pivot = 5 (elemento intermediário)
                                                                     Quicksort é muito próximo ao caso acima, ou
    O tempo de execução do Quicksort varia                           seja O(n ln n). Na implementação acima, o
    conforme a partição é balanceada1 ou não. Se a                   elemento pivot foi tomado como o elemento
    partição é balanceada o Quicksort roda tão                       intermediário do conjunto. Outras escolhas
    rápido quanto o Mergesort, com a vantagem que                    podem ser obtidas para gerar um melhor
    não precisar de array auxiliar.                                  particionamento. Algumas versões do Quicksort
                                                                     escolhem o pivot aleatoriamente e se demonstra
    O pior caso do Quicksort ocorre quando a                         que esta conduta gera resultados próximos do
    partição gera um conjunto com 1 elemento e                       ideal.
    outro com n-1 elementos para todos os passos do
    algoritmo. Sua desvantagem ocorre quando a                       Pergunta
    divisão do arranjo (que é baseada em                             Um algoritmo baseado em comparações pode
    comparação) fica muito desbalanceada (isto                       rodar em tempo menor que ( )?
    ocorre    quando   o    arranjo   está   quase
                                                                     Para   casos   especiais  podemos    conseguir
    ordenado/desordenado ou está completamente
                                                                     ordenação em tempo linear. O “bucketsort” é um
    ordenado/desordenado), mostraremos isso no
                                                                     exemplo disto.
    gráfico abaixo. Mesmo com essa desvantagem é
    provado que em média seu tempo tende a ser                       A resposta da pergunta anterior é não!



    1 Diz-se que a partição é balanceada quando após o               2Você pode encontrar uma edição mais recente em Th.H.
    pivoteamento, a quantidade de itens à esquerda e à direita do    Cormen, Ch.E. Leiserson, R.L. Rivest, C. Stein, Introduction to
    pivot são iguais.                                                Algorithms, 3rd edition, MIT Press, 2009


2
Considere um algoritmo de ordenação arbitrário           Então, podemos concluir que
    baseado em comparações. Podemos assumir, sem
    perda de generalidade, que todas as comparações                          ( )              (           )    (      )
    feitas pelo algoritmo são do tipo     .
                                                             Portanto, de fato, qualquer algoritmo de
    A árvore de decisão desse algoritmo é uma árvore
                                                             ordenação baseado em comparações tem
    binária cujos vértices internos estão rotulados
                                                             complexidade de pior caso ( ).
    por pares de elementos da sequência de entrada,
    denotados, por exemplo, por "ai : aj" . As arestas
    de um vértice interno para os seus filhos estão
                                                             2.2 UMA OLHADA NA IMPLEMENTAÇÃO
    rotuladas uma por ≤ e a outra por >.                     DO ALGORITMO

    O rótulo da raiz da árvore corresponde à primeira        Listagem 2:
    comparação efetuada pelo algoritmo. A subárvore          void swap(int* a, int* b) {
    esquerda da raiz descreve as comparações                    int tmp;
    subsequentes, caso o resultado desta primeira
    comparação, digamos,         , seja verdadeiro.              tmp = *a;
                                                                 *a = *b;
    Já a subárvore direita descreve as comparações               *b = tmp;
    caso o resultado dessa comparação seja falso.            }

    Com isso, cada sequência (a1, . . . , an)                int partition(int vec[], int esquerda, int direita) {
    corresponde a um caminho da raiz até uma folha              int i, j;
    da árvore de decisão.
                                                                 i = esquerda;
    Exemplo: A árvore de decisão do algoritmo de                 for (j = esquerda + 1; j <= direita; ++j) {
    inserção para n = 3 é:                                          if (vec[j] < vec[esquerda]) {
                                                                        ++i;
                                                                        swap(&vec[i], &vec[j]);
                                                                    }
                                                                 }
                                                                 swap(&vec[esquerda], &vec[i]);

                                                                 return i;
                                                             }

                                                             void quickSort(int vec[], int esquerda, int direita) {
                                                                int r;

                                                                 if (direita > esquerda) {
    Por exemplo, se a1 = 10, a2 = 5 e a3 = 7, o
                                                                     r = partition(vec, esquerda, direita);
    “caminho” do algoritmo na árvore de decisão
                                                                     quickSort(vec, esquerda, r - 1);
    acima é o caminho vermelho.
                                                                     quickSort(vec, r + 1, direita);
    Existem n! permutações de (1..n). Cada uma                   }
    delas deve aparecer em alguma das folhas da              }
    árvore de decisão. Portanto, a árvore de decisão
    deve ter pelo menos n! folhas. Por outro lado,
    uma árvore binária de altura h tem no máximo 2h
    folhas. Assim, se h é a altura da árvore de
    decisão de um algoritmo de ordenação baseado
    em comparações, então 2h ≥ n!.

    Sabemos, pela fórmula de Stirling3, que         ( ) .

                                                             assintótica para o fatorial de um número. Na sua forma mais
                                                             conhecida, ela se escreve:
    3Em matemática, a fórmula de Stirling recebe o nome do
    matemático James Stirling e estabelece uma aproximação
                                                                                       √     ( )


3
2.3 UM EXEMPLO ILUSTRADO                                        Seja

    Para um vetor com os valores {25, 57, 48, 37, 12,               Tp(n) = tempo para partir a tabela dada
    92, 86, 33}, usando a função partition da
    listagem 2, temos as seguintes sequências de                    Tqs(i) = tempo para ordenar a tabela da esquerda
    chamadas recursivas:
                                                                    Tqs(n-i-1) = tempo para ordenar a tabela da direita



                                                                    Análise para o melhor caso:

                                                                                         ( )               ( )                 ( )


                                                                                         ( )                                   ( )


                                                                                 ( )                                  ( )                ( )


                                                                           ( )                             ( )                 ( )               ( )

                                                                                                           ( )

                                                                                 ( )     (             )                                 ( )
    ENTENDENDO O GRÁFICO A primeira linha representa o
    vetor original antes da chamada ao algoritmo de partição; a
    segunda linha representa a situação do vetor após a partição;
    a terceira linha representa o vetor após o retorno das
    chamadas recursivas. De cima para baixo, observe somente        Logo:        ( )         (               )
    as duas primeiras linhas, depois, no retorno das chamadas
    (de baixo para cima), observe a terceira linha. Os valores em
    negrito representam o pivot. O símbolo <> representa um
    elemento inexistente (vetor vazio) e está na figura somente
    para exemplificar, não existindo de verdade.
                                                                    Análise para o pior caso:
    Exercício de fixação
    Faça o pivoteamento inicial usando teste de mesa                               ( )             ( )               ( )        (        )
    para um vetor que tenha os valores 12, 43, 1, 6,
    56, 23, 52, 9, usando a parte em vermelho da                                             ( )                           (        )
    listagem 1, depois usando a função partition da
    listagem 2 e finalmente, acesse o site                                       ( )                         (             )         (       )
    http://www.random.org/, na caixa True Random
                                                                       ( )                         (         )             (         )       (         )
    Number Generator altere o valor ‘Max:’ para 8 e
    clique no botão ‘Generate’ até que gere um                                                             ( )
    número entre 2 e 7, usando este número como
    valor da variável ‘i’ na linha ‘i = esquerda;’ da
    função partition da listagem 2. Qual dos                                             ( )           ∑                       ∑
    métodos foi melhor?
                                                                                                                 (         )
    2.4 COMPLEXIDADE                                                                             ( )

    Casos a considerar:

    Melhor caso:
                                                                    Logo:        ( )         (     )
    Verifica-se quando o vetor está sempre dividido
    precisamente ao meio.

    Pior caso:
    Uma das tabelas é vazia.




4
Complexidade de tempo: (       ) no melhor        int main(int argc, char *argv[]) {
    caso e (     ) no caso médio e ( ) no pior           int vetor[10];
    caso.                                                int i;

    Complexidade de espaço: (        ) no melhor          printf("Forneca 10 numeros...n");
    caso e (     ) no caso médio e (     ) no pior        for(i=0;i<10;i++) {
    caso. R. Sedgewick desenvolveu uma versão do             printf("Numero %2d: ", i+1);
    Quicksort com partição por recursão de cauda             scanf("%d", &vetor[i]);
    que tem complexidade ( ) no pior caso.                }

    Estabilidade: Quicksort é um algoritmo não
                                                          printf("nVetor original: {");
    estável, uma vez que valores iguais podem ser
                                                          for(i=0;i<10;i++) {
    trocados, não mantendo sua posição relativa
                                                             printf("%d", vetor[i]);
    dentro do vetor. Além do mais, é um algoritmo
                                                             if(i<9) printf(", ");
    destrutivo, uma vez que não é possível mais
                                                          }
    retornar à tabela original.
                                                          printf("}n");

    3 IMPLEMENTANDO O ALGORITMO                           qs(vetor, 0, 9); // algoritmo da listagem 1

    QUICKSORT EM LINGUAGEM                                printf("nVetor ordenado: {");
    C/C++                                                 for(i=0;i<10;i++) {
                                                             printf("%d", vetor[i]);
                                                             if(i<9) printf(", ");
    3.1 O USUÁRIO FORNECE OS                              }
    NÚMEROS                                               printf("}nn");
    #include <cstdlib>
                                                          system("PAUSE");
    #include <iostream>
                                                          return EXIT_SUCCESS;
                                                      }
    using namespace std;

    // listagem 1                                     3.2 O PROGRAMA GERA UMA
    void qs(int *A, int esquerda, int direita) {      QUANTIDADE FIXA DE NÚMEROS
       register int i, j;
       int x, y;
                                                      ALEATÓRIOS
                                                      #include <cstdlib>
        i = esquerda;                                 #include <iostream>
        j = direita;                                  #include <time.h>
        // Elemento intermediário como “pivot”
        x = A[(esquerda + direita) / 2];              using namespace std;

        do {                                          const int MAX_SIZE = 250; // altere aqui a
           while((A[i] < x) && (i < direita)) i++;    quantidade
           while((A[j] > x) && (j > esquerda)) j--;
           if(i <= j){                                void swap(int* a, int* b) {
              swap(A, i, j);                             int tmp;
              i++;
              j--;                                        tmp = *a;
           }                                              *a = *b;
        } while(i <= j);                                  *b = tmp;
                                                      }
        if(esquerda < j) qs(A, esquerda, j);
        if(i < direita) qs(A, i, direita);
    }




5
int partition(int vec[], int esquerda, int direita) {        // algoritmo da listagem 2
       int i, j;                                                 quickSort(vetor, 0, MAX_SIZE - 1);

        i = esquerda;                                            printf("nVetor ordenado:n{");
        for (j = esquerda + 1; j <= direita; ++j) {              for(i=0;i<MAX_SIZE;i++) {
           if (vec[j] < vec[esquerda]) {                            printf("%d", vetor[i]);
               ++i;                                                 if(i<MAX_SIZE-1) printf(", ");
               swap(&vec[i], &vec[j]);                           }
           }                                                     printf("}nn");
        }
        swap(&vec[esquerda], &vec[i]);                           system("PAUSE");
                                                                 return EXIT_SUCCESS;
        return i;                                            }
    }
                                                             Maximize a tela de saída e use a barra de
    void quickSort(int vec[], int esquerda, int direita) {   rolagem vertical para ver a saída completa do
       int r;                                                programa.


        if (direita > esquerda) {                            3.3. O PROGRAMA GERA UMA
            r = partition(vec, esquerda, direita);           QUANTIDADE QUALQUER DE NÚMEROS
            quickSort(vec, esquerda, r - 1);
            quickSort(vec, r + 1, direita);                  ALEATÓRIOS SOLICITADA PELO
        }                                                    USUÁRIO
    }
                                                             Deixarei este a cargo de vocês. Minha sugestão,
                                                             para simplificar, é fazer um grande vetor,
    int main(int argc, char *argv[]) {                       digamos, um milhão de inteiros, e ter uma
       int vetor[MAX_SIZE];                                  variável que controle o tamanho máximo dos
       int i;                                                dados que o usuário desejar. Forneça os valores
                                                             de forma aleatória.
        // nova semente para numeros aleatorios
        srand(time(NULL));                                   4 TERMINAMOS
       printf("Gerando     %d    numeros    inteiros         Terminamos por aqui.
    aleatoriamente.nAguarde...nn", MAX_SIZE);
                                                             Corra para o próximo tutorial.
       for(i=0;i<MAX_SIZE;i++) {
          // gera numeros entre 0 e 99999
          vetor[i]=rand()%100000*rand()%100000;
       }

        printf("nVetor original:n{");
        for(i=0;i<MAX_SIZE;i++) {
           printf("%d", vetor[i]);
           if(i<MAX_SIZE-1) printf(", ");
        }
        printf("}n");




6

Weitere ähnliche Inhalte

Was ist angesagt?

Trabalho métodos de ordenação
Trabalho métodos de ordenaçãoTrabalho métodos de ordenação
Trabalho métodos de ordenaçãoDaiana de Ávila
 
Ordenação de vetores
Ordenação de vetoresOrdenação de vetores
Ordenação de vetoresalfredtaddeus
 
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
 
Semana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetoresSemana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetoresPedro Valente
 
Tutorial aed iii 001 - algoritmo de ordenação shellsort
Tutorial aed iii   001 - algoritmo de ordenação shellsortTutorial aed iii   001 - algoritmo de ordenação shellsort
Tutorial aed iii 001 - algoritmo de ordenação shellsortFlávio Freitas
 
Comparativo bubble sort e quick sort
Comparativo bubble sort e quick sortComparativo bubble sort e quick sort
Comparativo bubble sort e quick sortDaiana de Ávila
 
Trabalho de algoritmos
Trabalho de algoritmosTrabalho de algoritmos
Trabalho de algoritmosSandro Arpi
 
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
 
Análise da complexidade de algoritmos
Análise da complexidade de algoritmosAnálise da complexidade de algoritmos
Análise da complexidade de algoritmosPablo Silva
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2Rogerio Oliveira
 
Tutorial Octave Matlab
Tutorial Octave MatlabTutorial Octave Matlab
Tutorial Octave Matlabblogmaxima
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Universidade de São Paulo
 
Metodos de ordenação estrutura de dados
Metodos de ordenação   estrutura de dadosMetodos de ordenação   estrutura de dados
Metodos de ordenação estrutura de dadosThalita Chaves
 

Was ist angesagt? (17)

Trabalho métodos de ordenação
Trabalho métodos de ordenaçãoTrabalho métodos de ordenação
Trabalho métodos de ordenação
 
Ordenação de vetores
Ordenação de vetoresOrdenação de vetores
Ordenação de vetores
 
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
 
Semana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetoresSemana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetores
 
Tutorial aed iii 001 - algoritmo de ordenação shellsort
Tutorial aed iii   001 - algoritmo de ordenação shellsortTutorial aed iii   001 - algoritmo de ordenação shellsort
Tutorial aed iii 001 - algoritmo de ordenação shellsort
 
Comparativo bubble sort e quick sort
Comparativo bubble sort e quick sortComparativo bubble sort e quick sort
Comparativo bubble sort e quick sort
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
Ordenação
OrdenaçãoOrdenação
Ordenação
 
Trabalho de algoritmos
Trabalho de algoritmosTrabalho de algoritmos
Trabalho de algoritmos
 
Algoritmos de busca
Algoritmos de buscaAlgoritmos de busca
Algoritmos de busca
 
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
 
Análise da complexidade de algoritmos
Análise da complexidade de algoritmosAnálise da complexidade de algoritmos
Análise da complexidade de algoritmos
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
 
Tutorial Octave Matlab
Tutorial Octave MatlabTutorial Octave Matlab
Tutorial Octave Matlab
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
 
Metodos de ordenação estrutura de dados
Metodos de ordenação   estrutura de dadosMetodos de ordenação   estrutura de dados
Metodos de ordenação estrutura de dados
 
Simulink 4
Simulink 4Simulink 4
Simulink 4
 

Andere mochten auch

Tutorial aed iii 006 - algoritmo de ordenação quicksort
Tutorial aed iii   006 - algoritmo de ordenação quicksortTutorial aed iii   006 - algoritmo de ordenação quicksort
Tutorial aed iii 006 - algoritmo de ordenação quicksortFlávio Freitas
 
Tutorial aed iii 005 - algoritmo de ordenação quicksort
Tutorial aed iii   005 - algoritmo de ordenação quicksortTutorial aed iii   005 - algoritmo de ordenação quicksort
Tutorial aed iii 005 - algoritmo de ordenação quicksortFlávio Freitas
 
Aprendendo a programar em arduino
Aprendendo a programar em arduinoAprendendo a programar em arduino
Aprendendo a programar em arduinoChellton Almeida
 
Guia arduino iniciante multilogica ARDUINO
Guia arduino iniciante multilogica ARDUINOGuia arduino iniciante multilogica ARDUINO
Guia arduino iniciante multilogica 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
 
Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)Chellton Almeida
 
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
 
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
 

Andere mochten auch (20)

Tutorial aed iii 006 - algoritmo de ordenação quicksort
Tutorial aed iii   006 - algoritmo de ordenação quicksortTutorial aed iii   006 - algoritmo de ordenação quicksort
Tutorial aed iii 006 - algoritmo de ordenação quicksort
 
Tutorial aed iii 005 - algoritmo de ordenação quicksort
Tutorial aed iii   005 - algoritmo de ordenação quicksortTutorial aed iii   005 - algoritmo de ordenação quicksort
Tutorial aed iii 005 - algoritmo de ordenação quicksort
 
POO - 05 - Ambiente de Desenvolvimento
POO - 05 - Ambiente de DesenvolvimentoPOO - 05 - Ambiente de Desenvolvimento
POO - 05 - Ambiente de Desenvolvimento
 
Aprendendo a programar em arduino
Aprendendo a programar em arduinoAprendendo a programar em arduino
Aprendendo a programar em arduino
 
Guia arduino iniciante multilogica ARDUINO
Guia arduino iniciante multilogica ARDUINOGuia arduino iniciante multilogica ARDUINO
Guia arduino iniciante multilogica ARDUINO
 
Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
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
 
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
 
Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)
 
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
 
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
 

Ähnlich wie Quicksort em 3 passos

Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Thaci Santos
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmosRicardo Bolanho
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptssuserd654cb1
 
Algoritmos e Estruturas de Dados, edição de 2013/2014
Algoritmos e Estruturas de Dados, edição de 2013/2014Algoritmos e Estruturas de Dados, edição de 2013/2014
Algoritmos e Estruturas de Dados, edição de 2013/2014Pedro Guerreiro
 
Cartilha de Octave para Matematica Computacional.pdf
Cartilha de Octave para Matematica Computacional.pdfCartilha de Octave para Matematica Computacional.pdf
Cartilha de Octave para Matematica Computacional.pdfEdkallenn Lima
 
Principais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoPrincipais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoIntel Software Brasil
 
Recursividade em C
Recursividade em CRecursividade em C
Recursividade em CCaique Silva
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-Cosmarcf
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaDeivid Martins
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10PeslPinguim
 
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...Manuel Menezes de Sequeira
 

Ähnlich wie Quicksort em 3 passos (20)

Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.Algoritmo de ordenação heapsort.
Algoritmo de ordenação heapsort.
 
Algoritmo0
Algoritmo0Algoritmo0
Algoritmo0
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmos
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
Visualg
VisualgVisualg
Visualg
 
Aula2
Aula2Aula2
Aula2
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Quicksort
QuicksortQuicksort
Quicksort
 
Algoritmos e Estruturas de Dados, edição de 2013/2014
Algoritmos e Estruturas de Dados, edição de 2013/2014Algoritmos e Estruturas de Dados, edição de 2013/2014
Algoritmos e Estruturas de Dados, edição de 2013/2014
 
Cartilha de Octave para Matematica Computacional.pdf
Cartilha de Octave para Matematica Computacional.pdfCartilha de Octave para Matematica Computacional.pdf
Cartilha de Octave para Matematica Computacional.pdf
 
Principais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorizaçãoPrincipais conceitos e técnicas em vetorização
Principais conceitos e técnicas em vetorização
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Recursividade em C
Recursividade em CRecursividade em C
Recursividade em C
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 
TDC2013 Otimizando-C
TDC2013 Otimizando-CTDC2013 Otimizando-C
TDC2013 Otimizando-C
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e Distribuída
 
Curso de java 02
Curso de java 02Curso de java 02
Curso de java 02
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10
 
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
 

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....LuizHenriquedeAlmeid6
 
Slides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxSlides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxMauricioOliveira258223
 
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdfPRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdfprofesfrancleite
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMHELENO FAVACHO
 
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇJaineCarolaineLima
 
Atividade - Letra da música Esperando na Janela.
Atividade -  Letra da música Esperando na Janela.Atividade -  Letra da música Esperando na Janela.
Atividade - Letra da música Esperando na Janela.Mary Alvarenga
 
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfplanejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfmaurocesarpaesalmeid
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfTutor de matemática Ícaro
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxferreirapriscilla84
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...Rosalina Simão Nunes
 
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteCOMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteVanessaCavalcante37
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfEmanuel Pio
 
About Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de HotéisAbout Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de Hotéisines09cachapa
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfHELENO FAVACHO
 
Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?AnabelaGuerreiro7
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números Mary Alvarenga
 
Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"Ilda Bicacro
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfHELENO FAVACHO
 
Bloco de português com artigo de opinião 8º A, B 3.docx
Bloco de português com artigo de opinião 8º A, B 3.docxBloco de português com artigo de opinião 8º A, B 3.docx
Bloco de português com artigo de opinião 8º A, B 3.docxkellyneamaral
 

Kürzlich hochgeladen (20)

Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
 
Slides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxSlides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptx
 
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdfPRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
PRÉDIOS HISTÓRICOS DE ASSARÉ Prof. Francisco Leite.pdf
 
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEMPRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
PRÁTICAS PEDAGÓGICAS GESTÃO DA APRENDIZAGEM
 
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
 
Atividade - Letra da música Esperando na Janela.
Atividade -  Letra da música Esperando na Janela.Atividade -  Letra da música Esperando na Janela.
Atividade - Letra da música Esperando na Janela.
 
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfplanejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptx
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
 
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteCOMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdf
 
About Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de HotéisAbout Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de Hotéis
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
 
Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?Urso Castanho, Urso Castanho, o que vês aqui?
Urso Castanho, Urso Castanho, o que vês aqui?
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números
 
Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
 
Bloco de português com artigo de opinião 8º A, B 3.docx
Bloco de português com artigo de opinião 8º A, B 3.docxBloco de português com artigo de opinião 8º A, B 3.docx
Bloco de português com artigo de opinião 8º A, B 3.docx
 

Quicksort em 3 passos

  • 1. ALGORITMOS E ESTRUTURAS DE DADOS III Tutorial 4 (usa o compilador de linguagem C Dev-C++ versão 4.9.9.2) Parte 1 de 3 sobre o algoritmo de ordenação quick (rápido) conhecido como Quicksort.
  • 2. O algoritmo Quicksort pode ser dividido nos 1 INTRODUÇÃO seguintes passos: Esta série de tutoriais sobre Algoritmos e 1. O array A[p..r] é subdividido em dois arrays Estruturas de Dados III foi escrita usando o A[p..q] e A[q+1..r] não vazios tal que cada Microsoft Windows 7 Ultimate, Microsoft elemento de A[p..q] é menor ou igual a cada Office 2010, Bloodshed Dev-C++ versão 4.9.9.2 elemento de A[q+1..r]. O índice q é calculado (pode ser baixado em http://www.bloodshed.net), como parte deste particionamento. referências na internet e notas de aula do 2. Os dois subarrays A[p..q] e A[q+1..r] são professor quando estudante. Ela cobre desde os ordenados por recursivas chamadas do algoritmos de ordenação, passando pela pesquisa Quicksort. em memória primária e culminando com a pesquisa em memória secundária. Por exemplo, dado o array f e d h a c g b, e tomando o valor “d” para partição, o primeiro Nós entendemos que você já conhece o passo do Quicksort rearranja o array da seguinte compilador Dev-C++. No caso de você ainda não o forma: conhecer, dê uma olhada nos tutoriais Dev-C++ 001 a 017, começando pelo Tutorial Dev-C++ - Início: fedhacgb Antes f e e são maiores que d e estão à sua esquerda; 001 - Introdução. a, c e b são menores que d e estão à sua direita. Se não tem problemas com a linguagem C/C++ e Passo 1: b c a d h e g f o compilador Dev-C++, então o próximo passo é Agora b, c e a são menores que d e estão à sua esquerda; saber ler, criar e alterar arquivos em disco h, e, g e f são maiores que d e estão à sua direita. usando linguagem C/C++. Se ainda não sabe como fazê-lo, dê uma olhada nos tutoriais Dev- Esse processo é então repetido para cada seção – C++ 001 e 002, começando pelo Tutorial Dev-C++ isto é, “b c a” e “h e g f”. 001 – Criação, Leitura e Alteração de Arquivos. A vantagem é a não utilização de memória Se sabe todas as coisas anteriores, então a auxiliar. próxima etapa é conhecer os algoritmos mais básicos de ordenação. Em minhas notas de aula 2.1 UMA OLHADA NO FUNCIONAMENTO você encontra um material básico, porém DO ALGORITMO detalhado e com algoritmos resolvidos, dos principais métodos de ordenação existentes. Essa implementação seleciona o valor intermediário para particionar o array (elemento Adotaremos o livro Projeto de Algoritmos com pivot). Para uma ordenação ótima, deveria ser Implementação em Pascal e C, Editora Cengage selecionado o valor que estivesse precisamente no Learning, de Nivio Ziviani, como livro-texto da centro da faixa de valores. Porém, isso não é fácil disciplina. Nele você encontrará os métodos de para a maioria do conjunto de dados. ordenação que iremos estudar. Seu próximo passo será estudar os algoritmos de ordenação por Inserção, Seleção e Shellsort. Você pode usar os links anteriores (em inglês) ou fazer uso do livro-texto. Se você seguiu todos os passos até aqui, está pronto para prosseguir com este tutorial. 2 O ALGORITMO DE ORDENAÇÃO QUICKSORT O Quicksort, como o Mergesort, é baseado em uma estratégia de dividir para conquistar e é um dos algoritmos de ordenação mais populares. O Quicksort é baseado no método de ordenação por trocas. 1
  • 3. Listagem 1: muito rápido [Cormen, 2002] 2, por isso o nome, void qs(int *A, int esquerda, int direita) { Ordenação-Rápida (ou Quicksort em inglês). register int i, j; int x, y; i = esquerda; j = direita; // Elemento intermediário como “pivot” x = A[(esquerda + direita) / 2]; do { while((A[i] < x) && (i < direita)) i++; while((A[j] > x) && (j > esquerda)) j--; if(i <= j){ A figura mostra um gráfico do comportamento do Quicksort no pior caso. Eixo Vertical: segundos de 0 à 11 swap(A, i, j); Eixo Horizontal: número de elementos de 100.000 à 2.000.000. i++; j--; Desde que a partição custa uma recorrência, } neste caso torna-se } while(i <= j); ( ) ( ) ( ) if(esquerda < j) qs(A, esquerda, j); e como ( ) ( ) não é difícil mostrar que if(i < direita) qs(A, i, direita); } ( ) ( ) A figura abaixo ilustra o funcionamento do Se a partição gera dois subconjuntos de tamanho Quicksort (parte em vermelho da listagem 1): n/2 temos a recorrência ( ) ( ) ( ) que pelo teorema master nos dá ( ) ( ) Pode ser mostrado que o caso médio do pivot = 5 (elemento intermediário) Quicksort é muito próximo ao caso acima, ou O tempo de execução do Quicksort varia seja O(n ln n). Na implementação acima, o conforme a partição é balanceada1 ou não. Se a elemento pivot foi tomado como o elemento partição é balanceada o Quicksort roda tão intermediário do conjunto. Outras escolhas rápido quanto o Mergesort, com a vantagem que podem ser obtidas para gerar um melhor não precisar de array auxiliar. particionamento. Algumas versões do Quicksort escolhem o pivot aleatoriamente e se demonstra O pior caso do Quicksort ocorre quando a que esta conduta gera resultados próximos do partição gera um conjunto com 1 elemento e ideal. outro com n-1 elementos para todos os passos do algoritmo. Sua desvantagem ocorre quando a Pergunta divisão do arranjo (que é baseada em Um algoritmo baseado em comparações pode comparação) fica muito desbalanceada (isto rodar em tempo menor que ( )? ocorre quando o arranjo está quase Para casos especiais podemos conseguir ordenado/desordenado ou está completamente ordenação em tempo linear. O “bucketsort” é um ordenado/desordenado), mostraremos isso no exemplo disto. gráfico abaixo. Mesmo com essa desvantagem é provado que em média seu tempo tende a ser A resposta da pergunta anterior é não! 1 Diz-se que a partição é balanceada quando após o 2Você pode encontrar uma edição mais recente em Th.H. pivoteamento, a quantidade de itens à esquerda e à direita do Cormen, Ch.E. Leiserson, R.L. Rivest, C. Stein, Introduction to pivot são iguais. Algorithms, 3rd edition, MIT Press, 2009 2
  • 4. Considere um algoritmo de ordenação arbitrário Então, podemos concluir que baseado em comparações. Podemos assumir, sem perda de generalidade, que todas as comparações ( ) ( ) ( ) feitas pelo algoritmo são do tipo . Portanto, de fato, qualquer algoritmo de A árvore de decisão desse algoritmo é uma árvore ordenação baseado em comparações tem binária cujos vértices internos estão rotulados complexidade de pior caso ( ). por pares de elementos da sequência de entrada, denotados, por exemplo, por "ai : aj" . As arestas de um vértice interno para os seus filhos estão 2.2 UMA OLHADA NA IMPLEMENTAÇÃO rotuladas uma por ≤ e a outra por >. DO ALGORITMO O rótulo da raiz da árvore corresponde à primeira Listagem 2: comparação efetuada pelo algoritmo. A subárvore void swap(int* a, int* b) { esquerda da raiz descreve as comparações int tmp; subsequentes, caso o resultado desta primeira comparação, digamos, , seja verdadeiro. tmp = *a; *a = *b; Já a subárvore direita descreve as comparações *b = tmp; caso o resultado dessa comparação seja falso. } Com isso, cada sequência (a1, . . . , an) int partition(int vec[], int esquerda, int direita) { corresponde a um caminho da raiz até uma folha int i, j; da árvore de decisão. i = esquerda; Exemplo: A árvore de decisão do algoritmo de for (j = esquerda + 1; j <= direita; ++j) { inserção para n = 3 é: if (vec[j] < vec[esquerda]) { ++i; swap(&vec[i], &vec[j]); } } swap(&vec[esquerda], &vec[i]); return i; } void quickSort(int vec[], int esquerda, int direita) { int r; if (direita > esquerda) { Por exemplo, se a1 = 10, a2 = 5 e a3 = 7, o r = partition(vec, esquerda, direita); “caminho” do algoritmo na árvore de decisão quickSort(vec, esquerda, r - 1); acima é o caminho vermelho. quickSort(vec, r + 1, direita); Existem n! permutações de (1..n). Cada uma } delas deve aparecer em alguma das folhas da } árvore de decisão. Portanto, a árvore de decisão deve ter pelo menos n! folhas. Por outro lado, uma árvore binária de altura h tem no máximo 2h folhas. Assim, se h é a altura da árvore de decisão de um algoritmo de ordenação baseado em comparações, então 2h ≥ n!. Sabemos, pela fórmula de Stirling3, que ( ) . assintótica para o fatorial de um número. Na sua forma mais conhecida, ela se escreve: 3Em matemática, a fórmula de Stirling recebe o nome do matemático James Stirling e estabelece uma aproximação √ ( ) 3
  • 5. 2.3 UM EXEMPLO ILUSTRADO Seja Para um vetor com os valores {25, 57, 48, 37, 12, Tp(n) = tempo para partir a tabela dada 92, 86, 33}, usando a função partition da listagem 2, temos as seguintes sequências de Tqs(i) = tempo para ordenar a tabela da esquerda chamadas recursivas: Tqs(n-i-1) = tempo para ordenar a tabela da direita Análise para o melhor caso: ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ENTENDENDO O GRÁFICO A primeira linha representa o vetor original antes da chamada ao algoritmo de partição; a segunda linha representa a situação do vetor após a partição; a terceira linha representa o vetor após o retorno das chamadas recursivas. De cima para baixo, observe somente Logo: ( ) ( ) as duas primeiras linhas, depois, no retorno das chamadas (de baixo para cima), observe a terceira linha. Os valores em negrito representam o pivot. O símbolo <> representa um elemento inexistente (vetor vazio) e está na figura somente para exemplificar, não existindo de verdade. Análise para o pior caso: Exercício de fixação Faça o pivoteamento inicial usando teste de mesa ( ) ( ) ( ) ( ) para um vetor que tenha os valores 12, 43, 1, 6, 56, 23, 52, 9, usando a parte em vermelho da ( ) ( ) listagem 1, depois usando a função partition da listagem 2 e finalmente, acesse o site ( ) ( ) ( ) http://www.random.org/, na caixa True Random ( ) ( ) ( ) ( ) Number Generator altere o valor ‘Max:’ para 8 e clique no botão ‘Generate’ até que gere um ( ) número entre 2 e 7, usando este número como valor da variável ‘i’ na linha ‘i = esquerda;’ da função partition da listagem 2. Qual dos ( ) ∑ ∑ métodos foi melhor? ( ) 2.4 COMPLEXIDADE ( ) Casos a considerar: Melhor caso: Logo: ( ) ( ) Verifica-se quando o vetor está sempre dividido precisamente ao meio. Pior caso: Uma das tabelas é vazia. 4
  • 6. Complexidade de tempo: ( ) no melhor int main(int argc, char *argv[]) { caso e ( ) no caso médio e ( ) no pior int vetor[10]; caso. int i; Complexidade de espaço: ( ) no melhor printf("Forneca 10 numeros...n"); caso e ( ) no caso médio e ( ) no pior for(i=0;i<10;i++) { caso. R. Sedgewick desenvolveu uma versão do printf("Numero %2d: ", i+1); Quicksort com partição por recursão de cauda scanf("%d", &vetor[i]); que tem complexidade ( ) no pior caso. } Estabilidade: Quicksort é um algoritmo não printf("nVetor original: {"); estável, uma vez que valores iguais podem ser for(i=0;i<10;i++) { trocados, não mantendo sua posição relativa printf("%d", vetor[i]); dentro do vetor. Além do mais, é um algoritmo if(i<9) printf(", "); destrutivo, uma vez que não é possível mais } retornar à tabela original. printf("}n"); 3 IMPLEMENTANDO O ALGORITMO qs(vetor, 0, 9); // algoritmo da listagem 1 QUICKSORT EM LINGUAGEM printf("nVetor ordenado: {"); C/C++ for(i=0;i<10;i++) { printf("%d", vetor[i]); if(i<9) printf(", "); 3.1 O USUÁRIO FORNECE OS } NÚMEROS printf("}nn"); #include <cstdlib> system("PAUSE"); #include <iostream> return EXIT_SUCCESS; } using namespace std; // listagem 1 3.2 O PROGRAMA GERA UMA void qs(int *A, int esquerda, int direita) { QUANTIDADE FIXA DE NÚMEROS register int i, j; int x, y; ALEATÓRIOS #include <cstdlib> i = esquerda; #include <iostream> j = direita; #include <time.h> // Elemento intermediário como “pivot” x = A[(esquerda + direita) / 2]; using namespace std; do { const int MAX_SIZE = 250; // altere aqui a while((A[i] < x) && (i < direita)) i++; quantidade while((A[j] > x) && (j > esquerda)) j--; if(i <= j){ void swap(int* a, int* b) { swap(A, i, j); int tmp; i++; j--; tmp = *a; } *a = *b; } while(i <= j); *b = tmp; } if(esquerda < j) qs(A, esquerda, j); if(i < direita) qs(A, i, direita); } 5
  • 7. int partition(int vec[], int esquerda, int direita) { // algoritmo da listagem 2 int i, j; quickSort(vetor, 0, MAX_SIZE - 1); i = esquerda; printf("nVetor ordenado:n{"); for (j = esquerda + 1; j <= direita; ++j) { for(i=0;i<MAX_SIZE;i++) { if (vec[j] < vec[esquerda]) { printf("%d", vetor[i]); ++i; if(i<MAX_SIZE-1) printf(", "); swap(&vec[i], &vec[j]); } } printf("}nn"); } swap(&vec[esquerda], &vec[i]); system("PAUSE"); return EXIT_SUCCESS; return i; } } Maximize a tela de saída e use a barra de void quickSort(int vec[], int esquerda, int direita) { rolagem vertical para ver a saída completa do int r; programa. if (direita > esquerda) { 3.3. O PROGRAMA GERA UMA r = partition(vec, esquerda, direita); QUANTIDADE QUALQUER DE NÚMEROS quickSort(vec, esquerda, r - 1); quickSort(vec, r + 1, direita); ALEATÓRIOS SOLICITADA PELO } USUÁRIO } Deixarei este a cargo de vocês. Minha sugestão, para simplificar, é fazer um grande vetor, int main(int argc, char *argv[]) { digamos, um milhão de inteiros, e ter uma int vetor[MAX_SIZE]; variável que controle o tamanho máximo dos int i; dados que o usuário desejar. Forneça os valores de forma aleatória. // nova semente para numeros aleatorios srand(time(NULL)); 4 TERMINAMOS printf("Gerando %d numeros inteiros Terminamos por aqui. aleatoriamente.nAguarde...nn", MAX_SIZE); Corra para o próximo tutorial. for(i=0;i<MAX_SIZE;i++) { // gera numeros entre 0 e 99999 vetor[i]=rand()%100000*rand()%100000; } printf("nVetor original:n{"); for(i=0;i<MAX_SIZE;i++) { printf("%d", vetor[i]); if(i<MAX_SIZE-1) printf(", "); } printf("}n"); 6