Algoritmos e Estruturas de Dados I Aula 05: Métodos simples de ordenação (bogo Sort, selection Sort, insertion Sort, bubble Sort) Prof. Jesús P. Mena-Chalco 1Q-2016 1
Ordenação Ordenar corresponde ao processo de re-arranjar um conjunto de objetos em ordem ascendente ou descendente. Por que ordenar? O objetivo principal da ordenação é facilitar a recuperação posterior de itens do conjunto ordenado. As ordens mais utilizadas são a numérica e lexicográfica. 2
21/03/2016 3
Por que ordenar? Busca de elementos: O usuário geralmente quer os dados ordenados. Deduplicação de elementos: Ordenar é muito útil para eliminar duplicações. Projeção de objetos em um espaço 3D. Criação de uma árvore geradora mínima. Ordenar é o primeiro passo para carregar os dados em uma estrutura tipo árvore B+. 4
Algoritmos para ordenar elementos Baseado em comparações: Bogo sort Selection sort Insertion sort Bubble sort Mergesort Quicksort Heapsort Ordenação em tempo linear: Radix sort Ordenação de primeiros elementos (seleção parcial): Partial Quicksort 5
O problema de ordenar na forma crescente Um vetor v[0..n-1] é crescente se v[0] v[1] [n-1] O problema de ordenação de um vetor consiste em rearranjar (ou seja, permutar) os elementos de um vetor v[0..n-1] de tal modo que ele se torne crescente. Vetores ordenados: {1, 1, 1, 1, 1, 1, 1, 1} {0, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 100} 6
Verificar se um vetor v[0..n-1] é crescente 7
Número de comparações T(n): - No melhor caso: T(n) = 1 - No pior caso: T(n) = n-1 T(n) = O(n) Crie uma versão recursiva da função crescente 8
Vetor crecente (recursiva) Número de comparações T(n): - No melhor caso: T(n) = 1 - No pior caso: T(n) = n-1 T(n) = O(n) 9
Embaralhando um vetor 10
Número de trocas de elementos T(n): - No melhor caso: T(n) = n - No pior caso: T(n) = n T(n) = O(n) 11
(1) Bogo sort Miracle sort Monkey sort Stupid sort 12
Número de comparações T(n): - No melhor caso: T(n) = n-1 - No pior caso: T(n) =? 13
(2) Selection Sort: Algoritmo de ordenação por seleção 14
Selection Sort Animação: https://www.cs.usfca.edu/~galles/visualization/comparisonsort.html 15
Selection Sort Complexidade computacional: No pior caso? 16
Selection Sort Quanto tempo o algoritmo consome para fazer o serviço? (A complexidade computacional é proporcional ao número de comparações v[imin]>v[j]) 17
Selection Sort Quanto tempo o algoritmo consome para fazer o serviço? (A complexidade computacional é proporcional ao número de comparações v[imin]>v[j]) 9 8 7 6 5 4 3 2 1 1 8 7 6 5 4 3 2 9 1 iteração n-1 2 iteração n-2 3 iteração n-3 n-1iteração 1 18
Selection Sort 1 iteração 2 iteração 3 iteração n-1iteração n-1 n-2 n-3 Tempo = (n 1)(n)/2 Tempo = n²/2 n/2 1 Se o vetor tiver n=10,000 elementos, o número de comparações (tempo) será proporcional a: 49,995,000. Se o computador fizer 1000 comparações por segundo, o tempo gasto será de: 49995 segundos = 832.25 min = 13.88 horas 19
Selection Sort Tempo = (n 1)(n)/2 Tempo = n²/2 n/2 Número de comparações para qualquer caso T(n) = n²/2 n/2 T(n) = O(n²) 20
Selection Sort Número de comparações: No pior caso = O(n²) tempo n 21
Crie uma versão recursiva do Selection Sort Assinatura: 22
23
(3) Insertion Sort: Algoritmo de ordenação por inserção 24
Insertion Sort Método preferido dos jogadores de cartas Em cada passo, a partir do i=1, o i-ésimo elemento da sequência fonte é apanhado e transferido para a sequência destino, sendo inserido no seu lugar apropriado. 0 1 2 3 4 5 1 5 7 10 55 6 1 5 7 10 55 6 6 Animação: https://www.cs.usfca.edu/~galles/visualization/comparisonsort.html 25
Insertion Sort A principal característica deste algoritmo consiste em ordenar o vetor utilizando um subvetor ordenado em seu inicio. A cada novo passo, acrescentamos a este subvetor mais um elemento até atingirmos o último elemento de um arranjo. Ordenado Sem ordem 26
void InsertionSort (int[] v, int n) 27
Insertion Sort Número de comparações T(n): - No melhor caso: T(n) = n-1 - No pior caso: T(n) =? P2: Versão recursiva 28
Insertion Sort n=7 0 1 2 3 Comparações 4 5 6 L= i=1 1 i=2 2 i=3 3 i=n-1 Este algoritmo é o mais apropriado quando os elementos do vetor estiverem semi-ordenados. n-1 Tempo = (n 1)(n)/2 Tempo = n²/2 n/2 Tempo = O(n²) 29
(4) Bubble Sort: Ordenação pelo método da bolha Ordenação por troca dois-a-dois 30
Bubble Sort O algoritmo de ordenação baseado em troca, consiste em intercalar pares de elementos que não estão em ordem até que não exista mais pares. O principio do bolha é a troca de valores entre posições consecutivas fazendo com que os valores mais altos borbulhem para o final do vetor. Animação: https://www.cs.usfca.edu/~galles/visualization/comparisonsort.html 31
Bubble Sort Crie uma função iterativa que permita ordenar de forma ascendente uma lista dada como entrada. void BubbleSort (int[] v, int n) 32
Bubble Sort n=7 0 1 2 3 4 5 6 L= Comparações k=n-1 n-1 k=n-2 n-2 k=n-3 n-3 k=1 1 Tempo = (n 1)(n)/2 Tempo = n²/2 n/2 33
Bubble Sort Número de comparações T(n): - No melhor caso: T(n) = n²/2 n/2 - No pior caso: T(n) = n²/2 n/2 Número de comparações T(n): - No melhor caso: T(n) = n-1 - No pior caso: T(n) = n² 34
Elegante? 35
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur vel est augue. Donec aliquam laoreet ipsum, ac sagittis odio aliquam quis. In eleifend est tortor, dapibus posuere odio consectetur id. Donec varius eget est eu luctus. Phasellus scelerisque, nunc laoreet feugiat sagittis, risus neque condimentum nisi, eget feugiat turpis purus quis urna. Mauris tempor eros in turpis tincidunt, bibendum euismod est pretium. Praesent ligula dui, fermentum a porttitor vitae, pulvinar ut odio. Suspendisse vitae pretium dolor, at sodales mauris. Sed consequat purus nec bibendum suscipit. Donec ultricies euismod enim, quis interdum mi ornare et. Ut facilisis elit vitae elementum fringilla. Pellentesque sed orci iaculis, imperdiet elit et, mollis enim. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur vel est augue. Donec aliquam laoreet ipsum, ac sagittis odio aliquam quis. In eleifend est tortor, dapibus posuere odio consectetur id. Donec varius eget est eu luctus. Phasellus scelerisque, nunc laoreet feugiat sagittis, risus neque condimentum nisi, eget feugiat turpis purus quis urna. Mauris tempor eros in turpis tincidunt, bibendum euismod est pretium. Praesent ligula dui, fermentum a porttitor vitae, pulvinar ut odio. Suspendisse vitae pretium dolor, at sodales mauris. Sed consequat purus nec bibendum suscipit. Donec ultricies euismod enim, quis interdum mi ornare et. Ut facilisis elit vitae elementum fringilla. Pellentesque sed orci iaculis, imperdiet elit et, mollis enim. 36
elegante? Direitos de autor: Dezignus 37
elegante? 38
elegante? 39
40