BC1424 Algoritmos e Estruturas de Dados I Aula 11: 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. Geralmente considerado no primeiro passo para resolver um problema prático. 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 qu 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 Atividade em aula 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²) 140000 120000 100000 80000 tempo 60000 40000 20000 490 470 450 430 410 390 370 350 330 310 290 270 250 230 n 210 190 170 150 130 110 90 70 50 30 10 0 21 Crie uma versão recursiva do Selection Sort Assinatura: 22 Crie uma versão recursiva do Selection Sort Assinatura: 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²/2 – n/2 34 Revisitando o problema de Busca Linear 35 Buscar Linear 36 Buscar Linear 37 Buscar Linear Vantagem da linguagem C (*) Versão de Bruno Rodrigues Ferreira (UFABC/2016) 38