Faculdade de Tecnologia de
     Presidente Prudente



Algorítmo de Ordenação


                  Análise e Desenvolvimento de Sistemas
                                             3º Módulo
O que é?

  Algoritmo que coloca os elementos de uma
dada sequência em uma certa ordem onde as
mais usadas são a numérica e a lexicográfica.
Lexigráfica

   Analisa a entrada de linhas de caracteres e
produz uma seqüência chamada de "símbolos
léxicos" (lexical tokens), ou somente "símbolos"
(tokens).
Shellsort
  (Diminuição de incrementos)

• Criado por Donald Shell em 1959, publicado
  pela Universidade de Cincinnati.

• Mais eficiente algoritmo de classificação
  dentre os de complexidade quadrática.

• É um refinamento do método de inserção
  direta.
Código em C
void shellSort(int * vet, int size) {
  int i , j , value;
  int gap = 1;
  do {
     gap = 3*gap+1;
  } while(gap < size);
  do {
            gap /= 3;
            for(i = gap; i < size; i++) {
        value =vet[i];
        j = i - gap;
        while (j >= 0 && value < vet[j]) {
            vet [j + gap] =vet[j];
            j -= gap;
        }
        vet [j + gap] = value;
     }
  } while ( gap > 1);
}
Exemplo de execução
Dado o vetor de entrada: 12, 43, 1, 6, 56, 23, 52, 9

             12, 43, 1, 6, 56, 23, 52, 9
             12, 43, 1, 6, 56, 23, 52, 9
             1, 43, 12, 6, 56, 23, 52, 9
             1, 6, 12, 23, 56, 43, 52, 9
             1, 6, 12, 23, 52, 43, 56, 9
             1, 6, 12, 23, 52, 9, 56, 43
             1, 6, 12, 9, 52, 23, 56, 43
             1, 6, 9, 12, 52, 23, 56, 43
             1, 6, 9, 12, 23, 52, 56, 43
             1, 6, 9, 12, 23, 52, 43, 56
             1, 6, 9, 12, 23, 43, 52, 56
  Obtemos o vetor ordenado: 1, 6, 9, 12, 23, 43, 52, 56.
Mergesort
                   (Fusão)
• É um exemplo de algoritmo de ordenação do tipo
  dividir-para-conquistar.
• Criar uma sequência ordenada a partir de duas
  outras também ordenadas dividindo a sequência
  original em pares de dados, ordena-as; depois as
  agrupa em sequências de quatro elementos, e
  assim por diante, até ter toda a sequência
  dividida em apenas duas partes. (resumir este
  tópico)
• Os três passos úteis do algoritmo são: dividir,
  conquistar e combinar.
Vantagem


  Algoritmo de ordenação de simples
implementação e fácil entendimento utilizando
chamadas recursivas.
Desvantagem


  Alto consumo de memória, devido a série de
chamadas recursivas.
Código em C
void mergesort(int begin, int end)        for(i = begin;i <= end;i++)
{                                                   {
        int left = 0, right = 0, middle                       if(right > end ||
= 0;                                      (left <= middle && A[left] <=
        int i = 0;                        A[right]))
                                                              {
         if(begin == end)                                                B[i] =
                   return;                A[left];
                                                                         left++;
         middle = (begin + end)/2;                            }
                                                              else
         mergesort(begin,middle);                             {
         mergesort(middle + 1,end);                                      B[i] =
                                          A[right];
                                                                         right++;
         left = begin;                                        }
         right = middle + 1;                        }
                                                    for(i = begin;i <= end;i++)
                                                              A[i] = B[i];
                                          }
Quicksort
                 (Rápido)
• Método de ordenação muito rápido e
  eficiente, inventado por C.A.R. Hoare em
  1960.
• Foi criado para tentar traduzir um dicionário
  de inglês para russo, ordenando as palavras.
• O Quicksort é um algoritmo de ordenação por
  comparação não-estável.
Como funciona?

  O Quicksort adota a estratégia de divisão e
conquista que consiste em rearranjar as chaves
de modo que as chaves "menores" precedam as
chaves "maiores".
C++
#include <algorithm>
#include <iterator>
#include <functional>
using namespace std;

template <typename T>
void sort(T begin, T end) {
  if (begin != end) {
     T middle = partition (begin, end,
bind2nd(less<iterator_traits<T>::value_type>(), *begin));
     sort (begin, middle);
     sort (max(begin + 1, middle), end);
  }
}
Algorítimo de ordenação
Algorítimo de ordenação

Algorítimo de ordenação

  • 1.
    Faculdade de Tecnologiade Presidente Prudente Algorítmo de Ordenação Análise e Desenvolvimento de Sistemas 3º Módulo
  • 2.
    O que é? Algoritmo que coloca os elementos de uma dada sequência em uma certa ordem onde as mais usadas são a numérica e a lexicográfica.
  • 3.
    Lexigráfica Analisa a entrada de linhas de caracteres e produz uma seqüência chamada de "símbolos léxicos" (lexical tokens), ou somente "símbolos" (tokens).
  • 4.
    Shellsort (Diminuiçãode incrementos) • Criado por Donald Shell em 1959, publicado pela Universidade de Cincinnati. • Mais eficiente algoritmo de classificação dentre os de complexidade quadrática. • É um refinamento do método de inserção direta.
  • 5.
    Código em C voidshellSort(int * vet, int size) { int i , j , value; int gap = 1; do { gap = 3*gap+1; } while(gap < size); do { gap /= 3; for(i = gap; i < size; i++) { value =vet[i]; j = i - gap; while (j >= 0 && value < vet[j]) { vet [j + gap] =vet[j]; j -= gap; } vet [j + gap] = value; } } while ( gap > 1); }
  • 6.
    Exemplo de execução Dadoo vetor de entrada: 12, 43, 1, 6, 56, 23, 52, 9 12, 43, 1, 6, 56, 23, 52, 9 12, 43, 1, 6, 56, 23, 52, 9 1, 43, 12, 6, 56, 23, 52, 9 1, 6, 12, 23, 56, 43, 52, 9 1, 6, 12, 23, 52, 43, 56, 9 1, 6, 12, 23, 52, 9, 56, 43 1, 6, 12, 9, 52, 23, 56, 43 1, 6, 9, 12, 52, 23, 56, 43 1, 6, 9, 12, 23, 52, 56, 43 1, 6, 9, 12, 23, 52, 43, 56 1, 6, 9, 12, 23, 43, 52, 56 Obtemos o vetor ordenado: 1, 6, 9, 12, 23, 43, 52, 56.
  • 8.
    Mergesort (Fusão) • É um exemplo de algoritmo de ordenação do tipo dividir-para-conquistar. • Criar uma sequência ordenada a partir de duas outras também ordenadas dividindo a sequência original em pares de dados, ordena-as; depois as agrupa em sequências de quatro elementos, e assim por diante, até ter toda a sequência dividida em apenas duas partes. (resumir este tópico) • Os três passos úteis do algoritmo são: dividir, conquistar e combinar.
  • 9.
    Vantagem Algoritmode ordenação de simples implementação e fácil entendimento utilizando chamadas recursivas.
  • 10.
    Desvantagem Altoconsumo de memória, devido a série de chamadas recursivas.
  • 11.
    Código em C voidmergesort(int begin, int end) for(i = begin;i <= end;i++) { { int left = 0, right = 0, middle if(right > end || = 0; (left <= middle && A[left] <= int i = 0; A[right])) { if(begin == end) B[i] = return; A[left]; left++; middle = (begin + end)/2; } else mergesort(begin,middle); { mergesort(middle + 1,end); B[i] = A[right]; right++; left = begin; } right = middle + 1; } for(i = begin;i <= end;i++) A[i] = B[i]; }
  • 13.
    Quicksort (Rápido) • Método de ordenação muito rápido e eficiente, inventado por C.A.R. Hoare em 1960. • Foi criado para tentar traduzir um dicionário de inglês para russo, ordenando as palavras. • O Quicksort é um algoritmo de ordenação por comparação não-estável.
  • 14.
    Como funciona? O Quicksort adota a estratégia de divisão e conquista que consiste em rearranjar as chaves de modo que as chaves "menores" precedam as chaves "maiores".
  • 15.
    C++ #include <algorithm> #include <iterator> #include<functional> using namespace std; template <typename T> void sort(T begin, T end) { if (begin != end) { T middle = partition (begin, end, bind2nd(less<iterator_traits<T>::value_type>(), *begin)); sort (begin, middle); sort (max(begin + 1, middle), end); } }