SlideShare une entreprise Scribd logo
1  sur  7
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Trabalho métodos de ordenação
Trabalho métodos de ordenaçãoTrabalho métodos de ordenação
Trabalho métodos de ordenação
Daiana de Ávila
 
Ordenação de vetores
Ordenação de vetoresOrdenação de vetores
Ordenação de vetores
alfredtaddeus
 
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
Flávio Freitas
 
Semana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetoresSemana10-ordenacao-pesquisa-vetores
Semana10-ordenacao-pesquisa-vetores
Pedro Valente
 
Comparativo bubble sort e quick sort
Comparativo bubble sort e quick sortComparativo bubble sort e quick sort
Comparativo bubble sort e quick sort
Daiana de Ávila
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
Rogerio Oliveira
 

Tendances (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
 

En vedette

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
Flá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 quicksort
Flávio Freitas
 
Aprendendo a programar em arduino
Aprendendo a programar em arduinoAprendendo a programar em arduino
Aprendendo a programar em arduino
Chellton Almeida
 
Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)Apostila Arduino.(Melhor Apostila)
Apostila Arduino.(Melhor Apostila)
Chellton Almeida
 
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
Laura
 

En vedette (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
 

Similaire à Tutorial aed iii 004 - algoritmo de ordenação quicksort

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 algoritmos
Ricardo Bolanho
 
Recursividade em C
Recursividade em CRecursividade em C
Recursividade em C
Caique Silva
 
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
PeslPinguim
 

Similaire à Tutorial aed iii 004 - algoritmo de ordenação quicksort (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...
 

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
 
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 dados
Flávio Freitas
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
Flá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

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
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
rosenilrucks
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
FabianeMartins35
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
azulassessoria9
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
WagnerCamposCEA
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
TailsonSantos1
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
RavenaSales1
 

Dernier (20)

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
 
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
 
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"
 
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...
 
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 I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfPROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
 
Construção (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãConstrução (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! Sertã
 
"É 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...
 
aula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.pptaula de bioquímica bioquímica dos carboidratos.ppt
aula de bioquímica bioquímica dos carboidratos.ppt
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
 
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
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
 
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
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
 
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdfPROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.pdf
PROJETO DE EXTENÇÃO - GESTÃO DE RECURSOS HUMANOS.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
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
 
Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
 

Tutorial aed iii 004 - algoritmo de ordenação quicksort

  • 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