Bubble Sort e Aula 16 - Shell Sort - Colégio Agrícola de Frederico

Propaganda
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.
Download