A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Universidade Federal de Alagoas – Campus Arapiraca

Apresentações semelhantes


Apresentação em tema: "Universidade Federal de Alagoas – Campus Arapiraca"— Transcrição da apresentação:

1 Universidade Federal de Alagoas – Campus Arapiraca
ALGORITMOS DE ORDENAÇÃO POR INSERÇÃO, INSERT SORT COMPARANDO TEMPO DE EXECUÇÃO COM SHELLSORT E QUICKSORT Alunos: Alyson Bispo Antônio C. Pacheco Cledson Medeiros Eduardo R. de Carvalho Prof.Alexandre Paes

2 Métodos de Ordenação Ordenação corresponde ao método de rearranjar um conjunto de objetos em uma ordem crescente ou decrescente Tem como objetivo facilitar a recuperação dos itens do conjunto Recuperação de nomes em um lista telefônica Atividade relevante e fundamental em processamento de dados

3 Algoritmos de Ordenação
São algoritmos que colocam os elementos de uma dada sequência em uma certa ordem (ascendente/descendente). As ordens mais usadas são a numérica e a lexicográfica (quando ordenamos palavras ou textos).

4 Algoritmos de Ordenação
Os tipos de ordenação vão dos mais simples: Bubble sort (Ordenação por trocas) Selection sort (Ordenação por seleção) Insertion sort (Ordenação por inserção) Aos mais sofisticados como: Count sort Quick sort Merge sort Heapsort Shell sort Radix sort Bucket sort Cocktail sort entre outros....

5 Chaves A comparação é feita através de uma determinada chave escolhida
Os registros são usados para representar os elementos a serem ordenados

6 Classificação – Quanto a Estabilidade
Métodos Instáveis: a ordem relativa dos itens com chaves iguais é alterada durante o processo de ordenação Métodos Estáveis: se a ordem relativa dos itens com chaves iguais mantém-se inalterada durante o processo Ex.: Se uma lista dos funcionários é ordenada pelo campo “Salário”, um método estável produz uma lista em que os funcionários com o mesmo salário aparecem em ordem alfabética Alguns dos métodos de ordenação mais eficientes não são estáveis

7 Estabilidade - Exemplo
10 20 30 40 50 60 70 80 90 R$ 100,00 200,00 400,00 500,00 600,00 Estável: 10 20 30 40 90 50 80 60 70 R$ 100,00 200,00 400,00 500,00 600,00 Instável: 20 10 30 90 40 50 80 70 60 R$ 100,00 200,00 400,00 500,00 600,00

8 Classificação: Quanto ao conjunto de registros
Ordenação Interna: o conjunto de registros cabe todo em na memória principal Ordenação Externa: o conjunto de registros não cabe completamente em memória principal, e deve ser armazenado em disco ou fita. Alguns autores utilizam ordenação de vetores (ordenação interna) e ordenação de registros (ordenação externa) Principal diferença: na ordenação interna, o registro pode ser acessado diretamente, enquanto na ordenação externa, o registros são acessados seqüencialmente ou em blocos

9 Ordenação Interna

10 Ordenação Interna Medidas de complexidade levam em conta:
O número de comparação entre as chaves O número de trocas entre os itens São classificados em dois tipos: Métodos Simples: mais recomendados para conjuntos pequenos de dados. Usam mais comparações, mas produzem códigos menores e mais simples; Métodos Eficientes ou Sofisticados: adequados para conjuntos maiores de dados. Usam menos comparações, porém produzem códigos mais complexos e com muitos detalhes.

11 Alguns Algoritmos de Ordenação Interna
Ordenação por Seleção (Selection Sort) Ordenação por Inserção (Insertion Sort) Ordenação por Seleção e Troca (Bubble Sort) Ordenação por Inserção através de incrementos decrescentes (ShellSort) Ordenação por Particionamento (QuickSort) Ordenação de Árvores (HeapSort) Métodos Simples Métodos Eficientes

12 Ordenação Interna Métodos Simples

13 Insertion Sort Insertion sort, ou ordenação por inserção, é um algoritimo simples e eficiente quando aplicado a um pequeno número de elementos pouco desordenados. Em termos gerais, ele percorre um vetor de elementos da esquerda para a direita e à medida que avança vai deixando os elementos mais à esquerda ordenados. O algoritmo de inserção funciona da mesma maneira com que muitas pessoas ordenam cartas em um jogo de baralho como o pôquer. void insertionSort(int v[], int n) { int i, j, chave; for(j=1; j<n; j++) { chave = v[j]; i = j-1; while(i >= 0 && v[i] > chave){ v[i+1] = v[i]; i--; } v[i+1] = chave;

14 Ordenação por Inserção (Insertion Sort)
Procedimento: Os elementos são divididos em uma seqüência de destino a1, ..., ai-1 e em uma seqüência fonte ai, ..., an. Em cada passo, a partir de i =2, o i-ésimo item da seqüência fonte é retirado e transferido para a seqüência destino sendo inserido na posição adequada

15 Ordenação por Inserção (Insertion Sort)
1 2 3 4 5 6 Chaves Iniciais O R D E A N O O R R D E N A i = 2 i = 3 A O R D E N A O R E N A D O R E N i = 4 A D E O R N i = 5 A D E N O R i = 6 R A D E N O Res.:

16 Ordenação por Inserção (Insertion Sort)
Melhor Caso O melhor caso no insertion sort ocorre quando o vetor ja está ordenado pois com isso ele vai correr o vetor e não precisará de nenhuma outra ação resultando em um tempo de Q(n).

17 Ordenação por Inserção (Insertion Sort)
Pior Caso O pior caso no insertion ocorre quando o vetor está na ordem decrescente pois assim ele terá que executar uma troca entre todos os elementos do vetor. Todas as trocas terão que percorrer o vetor inteiro ocasionando um tempo de O(n2).

18 Ordenação por Inserção (Insertion Sort)
Caso Médio O médio caso no insertion sort não muda em muito do pior caso e inclusive tem o mesmo tempo de execução: O(n2).

19 Ordenação Interna Métodos Eficientes

20 ShellSort Método proposto por Shell em 1959
É uma extensão da ordenação por inserção O Método de Inserção troca itens adjacentes quando procura o ponto de inserção na seqüência destino Se o menor item estiver na posição mais a direita no vetor, então o número de comparações e movimentações é igual a n – 1 para encontrar o seu ponto de inserção O Shellsort contorna o problema permitindo trocas de registros que estão distantes um do outro. Os itens que estão separados h posições são rearranjados de forma que todo h-ésimo item leva a uma seqüência ordenada

21 ShellSort - Explanação
private static void shellSort ( int [ ] v )         {              int i , j , h = 1, value ;                       do {               h = 3 * h + 1;            } while ( h < v.length );               h = h / 3;               for ( i = h; i < v.length; i++) {                  value = v [ i ];                  j = i - h;                  while (j >= 0 && value < v [ j ]) {                     v [ j + h ] = v [ j ];                     j = j - h;                  }                  v [ j + h ] = value;               }         } while ( h > 1 );  

22 ShellSort - Explanação
O Shellsort divide o seu vetor em várias partes e muitas vezes.  Funciona assim: A primeira coisa que ele faz é pegar o tamanho dos "pulos" para montar os pequenos vetores.   do {   h = 3 * h + 1;  }  while ( h < v.length );  }

23 ShellSort - Explanação
Imagine um vetor de 10 posições:    Supondo que "h" = 3, então:  será um dos pequenos vetores pra ordenar. O que aconteceu aqui? "h" é o tamanho dos pulos para selecionar o primeiro vetor (a cada três posições você pega o primeiro elemento).  Ordenando esse vetor fica:    0 2 5 4 3 1 6 8 9 7 

24 ShellSort - Explanação
Repetindo as operações anteriores, só que ao invés de iniciar da posição 0 você vai iniciar da posição 1:  0 2 5 4 3 1 6 8 9 7  Ordenando-os:  0 2 5 4 3 1 6 8 9 7  Iniciando da posição = 2  0 2 5 4 3 1 6 8 9 7  Ordenando-os:  0 2 1 4 3 5 6 8 9 7 

25 ShellSort Terminada a primeira parte da ordenação.
Vetor semi ordenado. Tudo o que foi feito se encontra nessa parte do código:  for ( i = h; i < v.length; i++) {                  value = v [ i ];                  j = i - h;                  while (j >= 0 && value < v [ j ]) {                     v [ j + h ] = v [ j ];                     j = j - h;                  }                  v [ j + h ] = value;               }   

26 ShellSort Agora dividimos o h por 3, ficando igual a 1 e repetimos a operação.   Ex: h=2 Seu vetor se encontra assim:    Repetindo a operação com h = 2, selecionando:  0 2 4 3 5 6 8 9 7  Ordenando-a:  0 2 4 3 5 6 7 9 8  Repetindo a operação tomando a posição = 1  0 2 4 3 5 6 7 9 8  Ordenando-a:  0 2 4 3 5 6 7 9 8   

27 ShellSort - UTILIZAÇÃO
Por ter uma implementação pequena, que requer poucas linhas de códigos. Por ser um método eficiente, pode ser utilizado em sistemas que não dispõe de muitos recursos de memória. O seu tempo de execução é sensível à ordem inicial do programa, o que lhe garante um bom uso em sequências já ordenadas. (herdado do método de inserção) O seu sistema não é estável, pois ele pode realizar troca de elementos de igual valor.

28 ShellSort Análise MELHOR CASO:
O melhor caso no Shell sort ocorre quando o vetor ja está ordenado pois com isso ele vai correr através do mesmo e não precisará de nenhuma outra ação resultando em um tempo de O(n).

29 ShellSort Análise PIOR CASO:
O pior caso no Shell ocorre quando o vetor está na ordem decrescente pois assim ele terá que executar uma troca entre todos os elementos do vetor. Todas as trocas terão que percorrer o vetor inteiro ocasionando um tempo de O(n).

30 ShellSort Análise CASO MÉDIO: O caso médio no Shell sort é relativo por causa da sequência de gaps do vetor a ser ordenado.

31 Observações A razão pela qual este método é mais eficiente ainda não é conhecida porque ninguém ainda foi capaz de analisar o algoritmo! A sua análise envolve problemas matemáticos muito difíceis, como definir qual a sequência de incrementos deve fornecer os melhores resultados... A sequência apresentada foi obtida de maneira empírica e uma análise matemática indica que o esforço computacional para ordenar n elementos é proporcional a n½ com o Shellsort

32 Ordenação por Particionamento ou Quicksort
O Quicksort é um método de ordenação muito rápido e eficiente, inventado por C. A. Hoare em 1960, quando visitou a Universidade de Moscou como estudante. Ele criou o 'Quicksort’ ao tentar traduzir um dicionário de inglês para russo, ordenando as palavras, tendo como objetivo reduzir o problema original em subproblemas que possam ser resolvidos mais fácil e rapidamente. Foi publicado em 1962 após uma série de refinamentos. O Quicksort é um algoritmo de ordenação não-estável (isto é, dados iguais podem ficar fora da ordem original de entrada). O Quicksort adota a estratégia de divisão e conquista.

33 Ordenação por Particionamento ou Quicksort
A parte mais delicada do método é o processo de partição. O vetor A [Esq..Dir] é rearranjado por meio da escolha arbitrária de um pivô x. O vetor A é particionado em duas partes: Parte esquerda: chaves ≤ x. Parte direita: chaves ≥ x.

34 Ordenação por Particionamento ou Quicksort
Algoritmo para o particionamento: 1. Escolha arbitrariamente um pivô x. 2. Percorra o vetor a partir da esquerda até que A[i] ≥ x. 3. Percorra o vetor a partir da direita até que A[j] ≤ x. 4. Troque A[i] com A[j]. 5. Continue este processo até os apontadores i e j se cruzarem.

35 Quicksort - Exemplo O pivô x é escolhido como sendo: Exemplo:
O elemento central: A[(i + j) / 2]. Exemplo:

36 Quicksort - Exemplo

37 Quicksort - Exemplo

38 Quicksort - Exemplo

39 Quicksort - Exemplo

40 Quicksort - Exemplo

41 Quicksort - Exemplo

42 Quicksort - Exemplo

43 Quicksort - Exemplo

44 Quicksort - Exemplo

45 Quicksort Análise Seja C(n) a função que conta o número de comparações. Pior caso: C(n) = O(n2) O pior caso ocorre quando, sistematicamente, o pivô é escolhido como sendo um dos extremos de um arquivo já ordenado. Isto faz com que o procedimento Ordena seja chamado recursivamente n vezes, eliminando apenas um item em cada chamada. O pior caso pode ser evitado empregando pequenas modificações no algoritmo. Para isso basta escolher três itens quaisquer do vetor e usar a mediana dos três como pivô.

46 Quicksort Análise Melhor caso: C(n) = 2C(n/2) + n = n log n
Esta situação ocorre quando cada partição divide o arquivo em duas partes iguais. Caso médio de acordo com Sedgewick e Flajolet (1996, p. 17): C(n) ≈ 1,386n log n – 0,846n, Isso significa que em média o tempo de execução do Quicksort é O(n log n).

47 Quicksort Vantagens: É extremamente eficiente para ordenar arquivos de dados. Necessita de apenas uma pequena pilha como memória auxiliar. Requer cerca de n log n comparações em média para ordenar n itens. Desvantagens: Tem um pior caso O(n2) comparações. Sua implementação é muito delicada e difícil: Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados. O método não é estável.

48 Comparação Insert Sort X Shellsort X quicksort
Há vários fatores que influenciam a escolha de um algoritmo de Ordenação: 1- Ordenação estável; 2- Espaço; 3- Tempo; 4- Simplicidade.

49 Comparação Insert Sort Shellsort Quicksort

50 Comparação de métodos de ordenação
Declarações Tempo do Melhor caso Tempo médio Tempo do pior caso Insert sort 9 O(n) O(n²) Shellsort 17 O(n7/6) O(n4/3) Quicksort 21 O(nlogn) O(n log n) O(n2)

51 Intervalos Ordenar 16 39μs 45 μs 51 μs 256 4,969 μs 1,230 μs 911 μs
Contagem de inserção Insert sort Shellsort Quicksort 16 39μs 45 μs 51 μs 256 4,969 μs 1,230 μs 911 μs 4,096 1.315 sec .033 sec .020 sec 65,536 sec 1.254 sec .461 sec

52 Algumas Considerações
Insertion sort, ou ordenação por inserção, é um simples algoritmo de ordenação, eficiente quando aplicado a um pequeno número de elementos. Shell sort é o mais eficiente algoritmo de classificação dentre os de complexidade quadrática. Quicksort é um método de ordenação muito rápido e eficiente, que faz Chamadas recursivas.

53 An improved Shellsort algorithm
Theoretical Computer Science 188 (1997)

54 An improved Shellsort algorithm
Refinamento do Insert Sort. “Dividir para conquistar” Busca Binária Refinamento do Shellsort para conseguir : O(n²) reduzida para => O(n log2 n) para o caso médio. Pior caso ainda com custo O(n²)

55 An improved Shellsort algorithm
Quanto mais ordenado o vetor, mais eficiente o novo algoritmo Conceitos da busca binária: A partir do meio do vetor, elementos maiores para a direita e menores para a esquerda

56 Chronos: A timing analyzer for embedded software
Published in: Science of Computer Programming 69 (2007) 56–67

57 Chronos: A timing analyzer for embedded software
Preocupação com softwares embarcados Memória limitada Consumo de bateria Processamento limitado Linguagem c Simulação de uma Micro-arquitetura pupular: Medidas para o pior caso mais seguras.

58 Chronos: A timing analyzer for embedded software
Insert sort Algoritmo simples Método menos eficiente e mais popular Piores tempos de ordenação

59 Chronos: A timing analyzer for embedded software

60 Chronos: A timing analyzer for embedded software
Apresentado em: “Second International Symposium on Leveraging Applications of Formal Methods”. De 17 algoritmos, apenas 2 com os resultados não encontrados. Vantagem: Código aberto Desvantagem: Servidor para download com login e senha.

61 Fun-Sort—or the chaos of unordered binary search
Published in: Discrete Applied Mathematics 144 (2004) 231 – 236

62 Fun-Sort—or the chaos of unordered binary search
Baseado na Busca binária: reduzir à metade, sucessivamente, o “universo de busca”. Objeto “procurado” é o local correto para cada elemento Evita comparações desnecessárias para vetores quase ordenados.

63 Fun-Sort—or the chaos of unordered binary search
Comparação do elemento do meio com o primeiro Segue os princípios do insert sort Caso médio melhor que o do insert Problemas: O pior caso n²logn Ainda em testes. Algoritmos justificado por teoremas Alguns teoremas não apresentam resultados melhores que o insert sort para o mesmo caso.

64 Artigos - Conclusões Algoritmo primitivo
Muitas tentativas de melhorar o pior caso Busca binária em quase todas as soluções So caso médio?

65 Referências. Biedl, Therese; Chan, Timothy ; D
.Referências . Biedl, Therese; Chan, Timothy ; D. Demaine, Erik; Fleischer, Rudolf; Golin, Mordecai; A. King, James ; Ro IanMun. Fun-Sort—or the chaos of unordered binary search. Published in: Discrete Applied Mathematics 144 (2004) 231 – Cormen, Thomas H., Charles E. [2001]. Introduction to Algorithms, 2 ª edição. McGraw-Hill, New York Knuth, Donald E. [1998]. The Art of Computer Programming, Volume 3, classificação e pesquisa. Li, Xianfeng; Liang, Yun; Mitra, Tulika; Roychoudhury, Abhik. Chronos: A timing analyzer for embedded software. Published in: Science of Computer Programming 69 (2007) 56–67. Liu, Renren. An improved Shellsort algorithm. Published in: Journal Theoretical Computer Science. Volume 188 Issue 1-2, Nov. 30, Elsevier Science Publishers Ltd. Essex, UK.

66 Fim!


Carregar ppt "Universidade Federal de Alagoas – Campus Arapiraca"

Apresentações semelhantes


Anúncios Google