Estrutura de Dados (DPADF 0056) Aula 15 – Bubble Sort Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet Prof. Bruno B. Boniati – www.cafw.ufsm.br/~bruno Ordenação por Seleção e Troca http://www.sorting-algorithms.com Bubble Sort • Método de ordenação por troca ou flutuação; • Um dos algoritmos mais simples; • Consiste em percorrer uma lista diversas vezes “empurrando” os elementos maiores para o final do vetor. • Seu funcionamento lembra a forma como as bolhas de ar procuram a saída em um fluído; Bubble Sort • Algoritmo: ▫ Percorra o vetor inteiro comparando elementos vizinhos (dois a dois); ▫ Troque as posições dos elementos se eles estiverem fora de ordem; ▫ Repita os dois primeiros passos até o ordenação estar completa. • Implementação: ▫ Laços de repetição aninhados. Bubble Sort (simulação) Dados originais 1ª Iteração 2ª Iteração Bubble Sort (simulação) 3ª Iteração 4ª Iteração 5ª Iteração Bubble Sort (simulação) 6ª Iteração Neste caso não há troca 7ª Iteração 8ª Iteração Neste caso não há troca Bubble Sort (simulação) 9ª Iteração Neste caso não há troca 10ª Iteração 11ª Iteração Não há troca nessa iteração e nem na próxima. Algoritmo – Bubble Sort void bubbleSort(int* vet, int tam) { int i; int trocou; do { tam--; trocou = 0; for(i = 0; i < tam; i++) if(vet[i] > vet[i + 1]) { troca(&vet[i],&vet[i+1]); trocou = 1; } } while(trocou); } Exercícios para fixação Bubble Sort para ordenar uma LDE • Implemente uma subrotina para ordenar uma lista duplamente encadeada utilizando a técnica Bubble Sort. ɸ 10 40 17 6 2 ɸ Estrutura de Dados (DPADF 0056) Aula 16 – Shell Sort Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet Prof. Bruno B. Boniati – www.cafw.ufsm.br/~bruno Ordenação por Inserção através de Incrementos http://www.sorting-algorithms.com Shell Sort • Resultado de trabalho publicado pelo matemático Donald Shell em 1959. • Ordenação por inserção através de incrementos; • Consiste em passar várias vezes pela lista dividindo-a em grupos. Nos grupos menores é aplicado outro método de ordenação (geralmente insertion sort). • É o algoritmo mais eficiente entre os de baixa complexidade de implementação; Shell Sort • Algoritmo: ▫ Inicialmente a seqüência original é dividida em grupos; Isso pode ser feito dividindo-se o tamanho da sequência ao meio. O resultado dessa divisão é guardado em uma variável (h, que representa a quantidade de saltos necessários para formar um grupo); ▫ Em seguida são aplicadas ordenações (com qualquer outro algoritmo) nos sub-grupos (que são formados saltando-se de “h em h elementos”); ▫ O valor de h vai sendo novamente dividido até que os “saltos” sejam de elemento em elemento; Shell Sort (simulação) Dados originais (5 elementos) Cálculo do número de saltos (valor inteiro) h = tam ÷ 2 1ª rodada (elementos de 2 em 2) Grupo 1 Grupo 2 h=2 Shell Sort (simulação) Ordenação do Grupo 1 1ª Iteração 2ª Iteração Ordenação do grupo 1 concluída Shell Sort (simulação) Ordenação do Grupo 2 1ª Iteração neste caso não há troca Novo cálculo do número de saltos (valor inteiro) h=h÷2 Observe que a ordenação da sequencia resultante é mínima h=1 Algoritmo – Shell Sort void shellSort(int* vet, int tam) { int h = tam / 2; int chave, j, i; while (h > 0) { for (i = h; i < tam; i++) { chave = vet[i]; j = i; while (j >= h && vet[j - h] > chave) { vet[j] = vet[j - h]; j = j - h; } vet[j] = chave; } h = h / 2; } } Exercícios para fixação Variações do Shell Sort • A definição do Shell Sort deixa em aberto a escolha do algoritmo utilizado para ordenar os subgrupos (apenas sugere-se a utilização de Insertion Sort) ▫ Experimente adaptar o algoritmo de ordenação Shell Sort, utilizando um algoritmo alternativo ao Insertion Sort para ordenar os subgrupos.