Upload
cristiane-acacio-rosa
View
731
Download
1
Embed Size (px)
Citation preview
Faculdade de Tecnologia de Presidente Prudente
Análise e Desenvolvimento de Sistemas3º Módulo
Algorítmo de Ordenação
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 Cvoid 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çãoDado o vetor de entrada: 12, 43, 1, 6, 56, 23, 52, 9
12, 43, 1, 6, 56, 23, 52, 912, 43, 1, 6, 56, 23, 52, 91, 43, 12, 6, 56, 23, 52, 91, 6, 12, 23, 56, 43, 52, 91, 6, 12, 23, 52, 43, 56, 91, 6, 12, 23, 52, 9, 56, 431, 6, 12, 9, 52, 23, 56, 431, 6, 9, 12, 52, 23, 56, 431, 6, 9, 12, 23, 52, 56, 431, 6, 9, 12, 23, 52, 43, 561, 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 Cvoid mergesort(int begin, int end){
int left = 0, right = 0, middle = 0;int i = 0;
if(begin == end)
return;
middle = (begin + end)/2;
mergesort(begin,middle);mergesort(middle + 1,end);
left = begin;right = middle + 1;
for(i = begin;i <= end;i++){if(right > end || (left <= middle &&
A[left] <= A[right])){B[i] = A[left];left++;}else{B[i] = A[right];right++;}}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); }}