UNIVERSIDADE FEDERAL DO PARÁ
CENTRO DE CIÊNCIAS EXATAS E NATURAIS
DEPARTAMENTO DE INFORMÁTICA
DISCIPLINA: ESTRUTURAS DE DADOS II
PROFESSOR: A B C SAMPAIO
ORDENAÇÃO DE DADOS
INTERCALAÇÃO - MERGESORT
ALUNOS: JORLAN TEIXEIRA COSTA NO: 9908802701
JOSÉ MARIA DE OLIVEIRA Jr. NO: 9908803401
CONSISTE EM DIVIDIR O VETOR EM DOIS OU MAIS,
ORDELÁ-LOS SEPARADAMENTE E INTERCALÁ-LOS DOIS
A DOIS FORMANDO, CADA PAR INTERCALADO, NOVOS
SEGMENTOS ORDENADOS ATÉ QUE RESULTE APENAS
UM SEGMENTO ORDENADO.
PARA OBTER A ORDENAÇÃO DOS SEGMENTOS
INICIAIS , PODE-SE USAR QUALQUER MÉTODO DE
INTERCALAÇÃO.
Segmentos previamente ordenados
intercala
intercala
ORDENADO
ORDENADO
Intercala
ORDENADO
PARA NÃO USAR OUTROS MÉTODOS , PODEMOS
INICIAR OS SEGMENTOS COM VALOR IGUAL A 1.
ESTE MÉTODO É CHAMADO DE MERGESORT.
MÉTODO DA INTERCALAÇÃO SIMPLES-MERGESORT
INICIA-SE COM SEGMENTOS DE VALOR IGUAL A 1.
COMO CADA SEGMENTO POSSUI APENAS 1
ELEMENTO CADA , JÁ ESTÃO ORDENADOS.
EXEMPLO
23 17
8 15
9 12 19
7
17 23 8 15 9 12 7 19
8 15 17 23 7 9 12 19
7 8 9 12 15 17 19 23
QUANDO O VET0R NÃO FOR UMA POTÊNCIA DE
2, OCORRERÁ UM SEGMENTO RESULTE SEM UM
PAR PARA SER INTERCALADO.
ESSE SEGMENTO QUE SERÁ O ULTIMO DO VETOR
É TRANSCRITO PARA A INTERAÇÃO SUBSEQUENTE.
EXEMPLO
23 17 8 15 9 12 19 7 14 10
17 23 8 15 9 12 7 19 10 14
8 15 17 23 7 9 12 19 10 14
7 8 9 10 12 15 17 19 23 10 14
7 8 9 10 12 14 15 17 19 23
A IMPLEMENTAÇÀO DO MÉTODO É
FEITA EM 3 NÍVEIS:
SIMPLEMERGE:
OPERAÇÃO DE INTERCALAÇÃO
DE UM PAR DE SEGMEMT0S
MERGEPASS:
INTERCALAÇÃO DE TODOS OS
PARES DE SEGMENTOS
ORDENADOS.
MERGESORT:
EFETUA TODA A SEQUÊNCIA
DE INTERCALAÇÃO
procedure simplemerge(c: vet; cI1, CF1,CI2, CF2:
integer; ca: vet; r: integer);
var
CAI1, CAI2, k, i: integer;
begin
CAI1:= CI1; CAI2:= CI2;
k:= r;
while (CAI1 <= CF1) and (CAI1 <= CF2 do
begin
if c[CAI1] < c[CAI2]
then
begin
ca[k]:= c[CAI2];
CAI1:= CAI1 + 1
end {then}
else
begin
ca[k]:= c[CAI2];
CAI2:= CAI2 + 1
end; {else}
k:= k + 1;
end; {while}
if CAI1 > CF1
then
for i:= CAI2 to CF2 do
begin
ca[k]:= c[i];
k:= k + 1;
end {for}
else
for i:= CAI1 to CF1
begin
ca[k]:= c[i];
k:= k + 1;
end; {for}
end; {simplemerge}
procedure mergepass(c, ca: vet;n, l: integer);
var
p, q, r, i: integer;
begin
p:= 1;
q:= p + l;
r:= 1;
while q <= n do
begin
simplemerge(c, p, q - 1, q, min(q + l - 1,
n), ca, r);
r:= r + 2*l;
p:= q + l;
q:= p + l;
end; {while}
if p <= n
then
for i:= p to n do
ca[i]:= c[i];
end; {mergepass}
procedure mergesort(c: vet; n: integer);
var
l, i: integer;ca:vet;
begin
l:= 1;
while l < n do
begin
if (l = 1) or (l = 4) or (l = 16) or
(l = 64) or (l = 256) or (l = 1024) or (l = 2048)
or (l = 4096)
then mergepass(c, ca, n, l)
else mergepass(ca, c, n, l);
l:= 2*l;
end; {while}
if (n = 2) or (n = 8) or (n =32) or (n = 128) or
(n = 512) or (n = 2048) or (n =8192)
then
for i:= 1 to n do
c[i]:= ca[i];
end; {mergesort}
EXEMPLO DE INTERCALAÇÃO
VETOR C
25
19
18
Q
P
P
CAI1:= CI1
CF1
VETOR CA
19
K:= R
CAI2:= CI2
CF2
25
K
10
Q
CAI1:= CI1
CAI2:= CI2
CF1
CF2
10
K:= R
18
K
VETOR CA
19
25
P
VETOR C
18
Q
CAI1:= CI1
CF1
10
18
K:= R
10
K
CAI2:= CI2
19
CAF2
25
INTERCALANDO SEQUÊNCIAS NATURAIS
CONSISTE EM TIRAR PROVEITO DAS
EVENTUAIS ORDENAÇÕES PARCIAIS.
BUSCA-SE OS SEGMENTOS JÁ ORDENADOS
EFETUANDO AS INTERCALAÇÕES A PARTIR
DELES.
EXEMPLO
23
23
11
11
74
42
23
23
42
11
74
42
96
65
11
58
42
58
65
58
58
65
74
65
87
87
87
74
99
99
99
87
36
94
36
94
36
94
94
99
ESTE MÉTODO DIMINUI O NÚMERO DE
INTERÇÕES EFETUADAS EM APENAS UMA
UNIDADE POR ISSO NÀO VALE A PENA
UTILIZAR ESTE MÉTODO.
EXEMPLO DE INTERCALAÇÃO
INTERCALAÇÃO DE ARQUIVOS CLASSIFICADOS
A INTERCALAÇÃO É FEITA COMPARANDO- SE
OS PRIMEIROS REGISTROS DE CADA UM DOS
ARQUIVOS A SEREM INTERCALADOS.
SELECIONA-SE AQUELE QUE POSSUIR A
MENOR CHAVE, TRANSFERINDO-A PARA A
SAÍDA.
ESSE REGISTRO É SUBSTITUÍDO
PELO SEU SUCESSOR E O PROCESSO É
REPETIDO ATÉ QUE NÃO SOBRE
NENHUM REGISTRO.
IMPLEMENTAÇÃO
• ARQUIVOS
ENTRADA: FILE(1) , FILE(2) , . . . , FILE(P) ;
SAÍDA: FILE(0).
• ÁRVORE DE SELEÇÃO
st[ 1 ] É A RAIZ DA ÁRVORE;
st[ 2i ] É A SUBÁRVORE DA ESQUERDA DE st[ i ]
i = 1, n div 2
st[ 2i + 1 ] É A SUBÁRVORE DA DIREITA DE st[ i ]
1
p-1
nodos não -folhas
p
2p-1
nodos folhas
14
13
09
05
08
17
15
11
10
29
19
16
18
35
35
23
24
22
72
.
.
.
.
.
.
.
.
.
.
.
.
.
21
.
.
09
05
08
14
13
17
15
11
10
29
21
19
16
18
35
23
24
22
72
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
.
13
09
05
08
14
15
17
19
11
10
29
21
23
16
18
35
.
24
22
72
.
.
.
.
.
.
.
.
.
.
.
.
.
35
.
05
13
09
10
08
14
15
17
19
11
18
29
21
23
16
22
35
.
24
.
72
.
.
.
.
.
.
.
.
.
.
35
.
.
.
09
13
05
11
10
08
14
15
17
19
16
18
29
21
23
24
22
35
.
.
.
72
.
.
.
.
.
.
.
.
.
.
35
.
.
05
09
13
08
11
10
29
14
15
17
19
16
18
35
21
23
24
22
72
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
.
procedure filemerge ( file, p, n );
begin
for i:=0 to p do
reset ( file (i) );
for i:=0 to p-1 do
st [1]:=minkey;
for i:=0 to 2*p-1 do
read (file (i-p+1) , st [i] );
for i:=0 to p-1 do
pop (st , file, 2*p-1 );
write (file (0), st[1] );
for i:=2 to n do
begin
pop (st , file, 2*p-1 );
write (file (0), st[1] );
end;
end;
CLASSIFICAÇÃO
POR
DISTRIBUIÇÃO DE CHAVES
ESTE MÉTODO DE CLASSIFICAÇÃO ANTECEDE AOS
COMPUTADORES DIGITAIS. ELE É UMA ADAPTAÇÃO DO
PROCESSO DE CLASSIFICAÇÃO MECÂNICA DE CARTÕES
PERFURADOS, UTILIZADOS PARA ARMAZENAMENTO DE
DADOS.
EXEMPLO
POR EXEMPLO, SUPONHAMOS QUE UM ARQUIVO
FORMADO POR 20 CARTÕES TIVESSE, EM UM CERTO
CAMPO, OS SEGUINTES VALORES PERFURADOS:
523, 018, 125, 937, 628, 431,
243, 705, 891, 362, 429, 005, 540,
353, 115, 427, 910, 580, 174, 456
A CLASSIFICAÇÃO PELA COLUNA QUE CONTÉM O
DÍGITO DA UNIDADE PRODUZIRIA A SEGUINTE
DISTRIBUIÇÃO PELOS ESCANINHOS
523, 018, 125, 937, 628, 431, 243, 705, 891, 362, 429,
005, 540, 353, 115, 427, 910, 580, 174, 456
CLASSIFICAÇÃO PELAS UNIDADES
115
580
353
005
910 891
243
705
427 628
540 431 362 523 174 125 456 937 018 429
0
1
2
3
4
5
6
7
8
9
RECOLHENDO OS CARTÕES NA ORDEM DESCRITA,TEMOS:
540, 910, 580, 431, 891, 362, 523, 243, 353, 174,
125, 705, 005, 115, 456, 937, 427, 018, 628, 429
CLASSIFICANDO PELA COLUNA DAS DEZENAS, OBTEMOS:
429
628
018 427
005 115 125 937 243 456
705 910 523 431 540 353 362 174 580 891
0
1
2
3
4
5
6
7
8
9
COLOCANDO-OS EM ORDEM, TEMOS:
705, 005, 910, 115, 018, 523, 125, 427, 628, 429,
431, 937, 540, 243, 353, 456, 362, 174, 580, 891
CLASSIFICANDO PELA COLUNA DA CENTENA, TEMOS:
456
174
431 580
018 125
362 429 540
937
005 115 243 353 427 523 628 705 891 910
0
1
2
3
4
5
6
7
8
9
AGORA FINALMENTE RETIRANDO-OS EM ORDEM
OBTEMOS OS CARTÕES NA ORDEM DESEJADA
005, 018, 115, 125, 174, 243, 353, 362, 427, 429,
431, 456, 523, 540, 580, 628, 705, 891, 910, 937
MÉTODO DA INDEXAÇÃO DIRETA - RADIXSORT
• UTILIZA-SE O DÍGITO COMO UM ÍNDICE QUE
VAI REMATER O DADO TODO PARA O ESCANINHO
CORRESPONDENTE.
• UTILIZA-SE UMA TABELA DE FREQUÊNCIAS
PARA CONTABILIZAR O NÚMERO DE CHAVES.
• UTILIZA-SE UMA TABELA DE FREQUÊNCIAS
ACUMILADASPARA INDICAR A POSIÇÃO
INICIAL DE CADA ESCANINHO.
• A MEDIDA QUE AS CHAVES VÃO SENDO DISTRIBUÍDAS
OS PONTEIROS VÃO SENDO INCREMENTADOS.
DÍGITO
0
1
2
3
4
5
6
7
8
9
FREQ.
3
2
1
3
1
4
1
2
2
1
0
3
5
6
9
10
14
15
17
19
FREQ. AC.
INDICA A POSIÇAÕ INICIAL DE CADA ESCANINHO
INDICA O NÚMERO DE OCORRÊNCIAS DAS CHAVES
{indica o dígito correspondente ao passo}
funtion parte (ch: integer; passo: 1..4);
begin
case passo of
1: parte:= ch mod 10;
2: parte:= (ch mod 100) div 10;
3: parte:= (ch mod 1000) div 100;
4: parte:= ch div 1000;
end;
end;
procedure distribuicao(c1:vet; n1:0..9999; p1: ..4)
var
c2: vet; f, fac: vet2; v: 0..9; i: 0..n1; k: 0..999
begin
for i:= o to 9 do
f[i]:= 0 {inicializa a }
{ tabela de frequências}
for i:= 1 to n1 do
begin
v:= parte(c1[i], p1);
f[v]:= f[v] + 1
end;
fac[0]:= 0;
fac[1]:= f[0];
for i:= 2 to 9 do
fac[i]:= fac[i - 1] + f[i - 1];
{fase de distribuição}
for i:= 1 to n1 do
begin
v:= parte(c1[i], p1);
k:= fac[v];
c2[k]:= c1[i];
fac[v]:= fac[v] + 1;
end;
end{distribuicao}
Download

FAÇA O da apresentação no power point