CES-11 Algoritmos g m e Estruturas de Dados Carlos Alberto Alonso Sanches Juliana de Melo Bezerra CES--11 CES Alguns algoritmos de ordenação Método da bolha (BubbleSort) Ordenação por seleção (SelectionSort) Ordenação por inserção (InsertionSort) Lower bound para a ordenação CES--11 CES Alguns algoritmos de ordenação Método da bolha (BubbleSort) Ordenação por seleção (SelectionSort) Ordenação por inserção (InsertionSort) Lower bound para a ordenação Alguns g algoritmos g m de ordenação ç A ordenação é o problema mais clássico da computação. Inicialmente, veremos algumas das suas resoluções mais simples: Ordenação pelo método da bolha (BubbleSort) Ordenação por seleção (SelectionSort) Ordenação por inserção (InsertionSort) Consideraremos sempre a ordenação de um vetor v de índices [1 [1..n]. n] Importante!! CES--11 CES Alguns algoritmos de ordenação Método da bolha (BubbleSort) Ordenação por seleção (SelectionSort) Ordenação por inserção (InsertionSort) Lower bound para a ordenação Método da bolha (BubbleSort) É um dos algoritmos mais simples e conhecidos. conhecidos Princípio: Os elementos vizinhos são comparados e, caso estejam fora de ordem, são trocados. A propagação dessas comparações permite isolar o maior (ou o menor) elemento do vetor. Repetindo-se esse processo com as demais posições do vetor, é possível ordená-lo completamente. Este método recebe este nome porque os elementos vão um a um até a sua posição final, de modo semelhante a b lh que sobem bolhas b em um tubo t b com água. á Exemplo p para p n=8 No esquema abaixo, abaixo a bolha “desce” desce (como se o tubo estivesse de ponta-cabeça) 1 44 44 12 12 12 12 6 6 2 55 12 42 42 18 6 12 12 3 12 42 44 18 6 18 18 18 4 42 55 18 6 42 42 42 42 5 94 18 6 44 44 44 44 44 18 6 55 55 55 55 55 55 7 6 67 67 67 67 67 67 67 8 67 94 94 94 94 94 94 94 6 Algoritmo g BubbleSort(){ for (i=1; i<n; i++) for (j=1; j<=n-i; j++) if (v[j] > v[j+1]) { x = v[j]; [j] v[j] = v[j+1]; v[j+1] = x; } } É lento, pois só faz comparações entre posições adjacentes. Pode ser melhorado com testes intermediários para verificar se o vetor já está ordenado. M Mesmo assim, i gasta tempo O(n O( 2) no pior i caso. CES--11 CES Alguns algoritmos de ordenação Método da bolha (BubbleSort) Ordenação por seleção (SelectionSort) Ordenação por inserção (InsertionSort) Lower bound para a ordenação Ordenação ç por p seleção ç (SelectionSort) Procedimento: P dim t : Selecione o menor elemento do vetor e troque-o q com o que está na posição 1. D c n Desconsiderando ran a pr primeira m ra p posição çã do vetor, t r, repita r p ta essa operação com as restantes. Exemplo mp com m n=6 Vetor inicial: 1 2 3 4 5 6 55 62 21 35 48 13 13 62 21 35 48 55 13 21 62 35 48 55 13 21 35 62 48 55 13 21 35 48 62 55 13 21 35 48 55 62 Algoritmo g m SelectionSort() { for (i=1; i<n; i++) { min = i; for (j=i+1; j<=n; j++) if (v[j] < v[min]) min = j; x = v[min]; v[min] = v[i]; v[i] = x; } } Sempre gasta tempo O(n2) CES--11 CES Alguns algoritmos de ordenação Método da bolha (BubbleSort) Ordenação por seleção (SelectionSort) Ordenação por inserção (InsertionSort) Lower bound para a ordenação Ordenação por p inserção (InsertionSort) Semelhante lh ao método é d de d ordenação d das d cartas de d um baralho. Procedimento: Verifica-se se o valor da posição 2 do vetor poderia ser colocado na posição 1. Repete-se este processo para as posições subsequentes, verificando-se o local adequado da inserção. A inserção de um elemento na sua nova posição exige a movimentação de vários outros. outros Exemplo mp com m n=6 34 8 64 51 32 21 8 64 51 32 21 Passo 1 34 8 elemento que pode ser inserido 34 64 51 32 21 64 51 32 21 mover 8 inserção 34 Exemplo mp com m n=6 Passo 2 8 34 64 51 32 21 64 Item que pode ser inserido Nã ocorre inserção, Não i ã pois i esse elemento l já está á no seu lugar l Exemplo mp com m n=6 Passo 3 8 34 64 51 32 21 51 Item que pode ser inserido 8 34 64 32 21 64 32 21 mover 8 34 51 inserção Exemplo mp com m n=6 Passo Pass 4 8 51 34 64 32 21 32 Item que pode d ser iinserido id 8 51 34 64 21 51 64 21 51 64 21 51 64 21 mover 8 34 mover 8 34 mover 8 32 inserção 34 Exemplo mp com m n=6 Passo 5 8 8 32 32 34 34 51 64 21 51 64 21 Item que pode ser inserido mover 8 32 34 51 64 mover 8 34 32 51 64 mover 8 32 34 51 64 32 34 51 64 mover 8 21 Final Algoritmo g m InsertionSort() { for (i=2; (i 2; i<=n; i< n; i++) { x = v[i]; for (j=i; j>1 && x<v[j-1]; j--) v[j] = v[j-1]; v[j] [j] = x; } } Gasta tempo O(n2) no pior caso. CES--11 CES Alguns algoritmos de ordenação Método da bolha (BubbleSort) Ordenação por seleção (SelectionSort) Ordenação por inserção (InsertionSort) Lower bound para a ordenação Lower bound para p a ordenação ç Até é agora, apresentamos algoritmos l que ordenam d n números em tempo O(n2). Por enquanto, esse é o nosso melhor lh resultado l d prático á (upper bound b d ) para o problema da ordenação baseado em comparações. Seria possível calcular um lower bound para esse problema? Em outras p palavras, desejamos j encontrar um limite inferior teórico para esse problema, isto é, a mínima complexidade p de tempo p de q quaisquer q de suas resoluções algorítmicas. Árvore de comparações mp ç Qualquer Q l algoritmo l itm de d ordenação d ã baseado b s d em m comparações pode ser representado em uma árvore biná i binária. Na raiz fica a primeira comparação realizada entre dois elementos do vetor; nos filhos, as comparações subsequentes. Deste modo, as folhas representam as possíveis soluções do problema. A altura l h dessa d á árvore é o número ú máximo á d de comparações que o algoritmo realiza, ou seja, o seu tempo de d pior i caso. Exemplo: Exemplo mp : com m 3 valores distintos v[1]:v[2] > < v[2]:v[3] v[ ] v[3] v[2]:v[3] < < > v[1] < v[2] < v[3] v[3] < v[2] < v[1] v[1]:v[3] [1] [3] < v[1] < v[3] < v[2] > v[1]:v[3] [1] [3] > v[3] < v[1] < v[2] < v[2] < v[1] < v[3] > v[2] < v[3] < v[1] Como estamos ordenando 3 elementos, há 3! possíveis resultados Generalização ç Na ordenação de n elementos d distintos, st ntos, há n! possíveis resultados, que correspondem às permutações desses elementos. p Portanto, qualquer árvore binária de comparações terá no mínimo n! folhas. folhas A árvore mínima de comparações tem exatamente n!! folhas. f lh Supondo S d que a altura lt dessa d árvore á seja j h, então LB(n) = h, onde LB(n) é o lower bound de tempo para a ordenação de n elementos. elementos Sabemos q que n! ≤ 2h, ou seja, j h ≥ lg g n! Logo, LB(n) ≥ lg n! Cálculo do lower bound Pela aproximação de Stirling: n! ≈ (2πn)1/2nne-n Portanto: lg n! ≈ lg (2π)1/2 + lg n1/2 + lg nn + lg e-n l n! ≈ O(1) + O(log lg O(l n) + O(n.log O(n l n) - O(n) Como LB(n) ( ) ≥ lg g n!, então LB(n) ( ) = Ω(n.log ( g n)) Se encontrarmos um algoritmo que, apenas com c mp çõ s e trocas comparações t c s, resolva s l a ordenação d n çã em m tempo O(n.log n), ele será ótimo e esse problema estará computacionalmente resolvido. resolvido