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
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
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
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
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
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

Ordenacao mini

  • 1.
    1 Métodos de Ordenação OrdenaçãoInterna 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 Umdos 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álisede 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) { inti, 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 Parauma 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