1. 1
Métodos de Ordenação
Ordenação Interna
Ordenação por Seleção;
Ordenação por Inserção;
Ordenação por Troca (Bubblesort);
Prof. Yandre Maldonado e Gomes da Costa
Prof.YandreMaldonado-1
Ordenação Interna
Memória interna (primária) suficiente
para armazenar os registros de dados
durante o processo de ordenação;
Medidas de complexidade relevantes
em ordenação interna:
C(n), número de comparações entre
chaves;
M(n), número de movimentações de itens
no arquivo;
Prof.YandreMaldonado-2
Ordenação Interna
Considere os seguintes tipos para os algoritmos
descritos a seguir:
#define MAX 40
struct pessoa
{
char nome[30];
int idade;
};
pessoa cadastro[MAX];
int n_cad;
Prof.YandreMaldonado-3
2. 2
Ordenação por Seleção
Um dos mais simples;
Princípio: selecione o menor elemento
do vetor e troque-o com o item que
está na primeira posição do vetor.
Repita estas duas operações com os n-1
itens restantes, depois com os n-2
itens, até que reste apenas um
elemento.
Prof.YandreMaldonado-4
Ordenação por Seleção
Exemplo:
Prof.YandreMaldonado-5
RONEDAI=6
ORNEDAI=5
ONREDAI=4
ONERDAI=3
ONEDRAI=2
ANEDROChaves Inicias:
654321
Algoritmo:
void ordena_selecao (void)
{
int i, j, min;
pessoa x;
for (i=0;i<=n_cad-2;i++)
{
min=i;
for (j=i+1;j<=n_cad-1;j++)
if (strcmp(cadastro[j].nome,cadastro[min].nome)<0) min=j;
x=cadastro[min];
cadastro[min]=cadastro[i];
cadastro[i]=x;
}
}
Prof.YandreMaldonado-6
Faz a troca
Seleciona o
menor
3. 3
Ordenação por Seleção
Análise de complexidade:
C(n) = (n2/2) – (n/2)
M(n) = 3 (n-1)
Em condições normais, com chaves do
tamanho de uma palavra, este método
é bastante interessante para arquivos
com até 1000 registros;
Aspecto negativo: o fato de o arquivo já
estar parcialmente ordenado não reduz
em nada o custo da ordenação.
Prof.YandreMaldonado-7
Ordenação por Inserção
Neste método, a seqüência a ser ordenada é
varrida a partir da posição 2, e cada item
apanhado na seqüência é inserido no seu
lugar apropriado em relação aos itens
anteriores da seqüência;
A colocação do item no seu lugar apropriado
na seqüência destino é realizada movendo-se
os itens com chaves maiores para a direita e
então inserindo o item na posição deixada
vazia.
Prof.YandreMaldonado-8
Ordenação por Inserção
Exemplo:
Prof.YandreMaldonado-9
RONEDAI=6
ARONEDI=5
ANROEDI=4
ANERODI=3
ANEDROI=2
ANEDROChaves Inicias:
654321
4. 4
Algoritmo:
void ordena_insercao (void)
{
int i, j;
pessoa x;
for (i=1;i<=n_cad-1;i++)
{
x=cadastro[i];
j=i-1;
while ((strcmp(x.nome,cadastro[j].nome)<0) && (j>=0))
{
cadastro[j+1]=cadastro[j]; //Empurra maiores para a direita
j=j-1;
}
cadastro[j+1]=x; //insere na posicao apropriada
}
}
Prof.YandreMaldonado-10
Ordenação por Inserção
O método de inserção é adequado para
os casos em que as informações já
estão “quase” ordenadas, pois neste
caso seu custo é muito baixo;
É também um bom método quando se
deseja adicionar uns poucos itens à
uma seqüência já ordenada.
Prof.YandreMaldonado-11
Ordenação por Troca
Este método permuta sistematicamente
pares de elementos que estão fora de
ordem até que não haja mais pares
não-ordenados;
Estratégia bolha, ou bubblesort:
consiste em “borbulhar” o maior
elemento para o fim da lista;
Prof.YandreMaldonado-12
5. 5
Ordenação por Troca
Inicialmente, percorre-se a lista
comparando pares de elementos
consecutivos e trocando os que
estiverem fora de ordem. Nesta
primeira varredura, o maior elemento é
“empurrado” para o fim da lista;
Na segunda varredura, o segundo maior
elemento será empurrado para a
penúltima posição, e assim por diante;
Prof.YandreMaldonado-13Prof.YandreMaldonado-14
Ordenação por Troca
Exemplo:
RANEDOMaior elemento no final
ARNEDOTroca 5 e 6
ANREDOTroca 4 e 5
ANERDOTroca 3 e 4
ANEDROTroca 2 e 3
ANEDRONão troca
654321Varredura 1
Prof.YandreMaldonado-15
Ordenação por Troca
Exemplo (continuação):
ROANEDSegundo maior elemento “empurrado”
para a penúltima posição
RAONEDTroca 4 e 5
RANOEDTroca 3 e 4
RANEODTroca 2 e 3
RANEDOTroca 1 e 2
654321Varredura 2
6. 6
Ordenação por Troca
Para uma lista de tamanho n, são
necessárias n-1 varreduras, pois cada
varredura leva um elemento para a sua
posição definitiva no fim da sublista. O
menor elemento de todos vai “sobrar” na
primeira posição;
Pior caso: quando a lista está em ordem
invertida, neste caso o número de trocas é
igual a (n-1)+(n-2)+(n-3)+...+1;
Prof.YandreMaldonado-16
Algoritmo:
void ordena_troca (void)
{
int i, j;
pessoa x;
for (i=0;i<=n_cad-2;i++) //controla qual é a varredura
for (j=0;j<=(n_cad-2)-i;j++) //faz a varredura
if (strcmp(cadastro[j+1].nome,cadastro[j].nome)<0)
{
x=cadastro[j];
cadastro[j]=cadastro[j+1]; //troca
cadastro[j+1]=x;
}
}
Prof.YandreMaldonado-17
Ordenação Interna
Bibliografia recomendada:
Ziviani, Nivio. Projeto de Algoritmos,
Editora Pioneira;
Salvetti, Dirceu Douglas & Barbosa, Lisbete
Madsen. Algoritmos, Makron Books;
Wirth, Niklaus. Algortimos e Estruturas de
Dados, Editora PHB;
Prof.YandreMaldonado-18