ordenaÇÃo de dados intercalaÇÃo - mergesort alunos: jorlan teixeira costa n o : 9908802701
Post on 03-Jan-2016
30 Views
Preview:
DESCRIPTION
TRANSCRIPT
ORDENAÇÃO DE DADOS
INTERCALAÇÃO - MERGESORT
ALUNOS: JORLAN TEIXEIRA COSTA NO: 9908802701
JOSÉ MARIA DE OLIVEIRA Jr. NO: 9908803401
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
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
Intercala
ORDENADO
ORDENADO 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);varCAI1, 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);varp, 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);varl, 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 10
P Q
CAI1:= CI1 CAI2:= CI2
CF1 CF2
P Q
CAI1:= CI1 CAI2:= CI2
CF1 CF2
VETOR CA 19 10
K:= R K K:= R K
25 18
VETOR CA 19 25 10 18
P Q
CAI1:= CI1 CF1 CAI2:= CI2 CAF2
VETOR C 10
K:= R K
18 19 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 74 42 11 65 58 87 99 36 94
23 42 74 11 58 65 87 99 36 94
11 23 42 58 65 74 87 99 36 94
11 23 96 42 58 65 74 87 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.
• ARQUIVOS
ENTRADA: FILE(1) , FILE(2) , . . . , FILE(P) ;
SAÍDA: FILE(0).
IMPLEMENTAÇÃO
• ÁRVORE DE SELEÇÃO
st[ 1 ] É A RAIZ DA ÁRVORE;
st[ 2i ] É A SUBÁRVORE DA ESQUERDA DE st[ i ]
st[ 2i + 1 ] É A SUBÁRVORE DA DIREITA DE st[ i ]i = 1, n div 2
1 p-1 p 2p-1
nodos não -folhas nodos folhas
14
17
21
35
.
.
.
05
10
18
22
.
.
.
13
15
19
23
.
.
.
08
29
35
72
.
.
.
09
11
16
24
.
.
.
17
21
35
.
.
.
10
18
22
.
.
.
15
19
23
.
.
.
29
35
72
.
.
.
11
16
24
.
.
.
14 13
09 0805
17
21
35
.
.
.
10
18
22
.
.
.
19
23
.
.
.
29
35
72
.
.
.
11
16
24
.
.
.
14 15
09 080513
17
21
35
.
.
.
18
22
.
.
.
19
23
.
.
.
29
35
72
.
.
.
11
16
24
.
.
.
14 15
09 081013
05
17
21
35
.
.
.
18
22
.
.
.
19
23
.
.
.
29
35
72
.
.
.
16
24
.
.
.
14 15
09
081013
05
11
17
21
35
.
.
.
18
22
.
.
.
19
23
.
.
.
35
72
.
.
.
16
24
.
.
.
14 15
09 08
1013
05
11 29
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
0 1 2 3 4 5 6 7 8 9
523 018125 937243
540910580
431891
362
353
174705005115
456427 628
429
CLASSIFICAÇÃO PELAS UNIDADES
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:
0 1 2 3 4 5 6 7 8 9
540 910 580431 891362523 243
353 174125
705005 115 456937
427018628 429
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:
0 1 2 3 4 5 6 7 8 9
427 115 891
431
910628243 429
523 705
580
005018 125 540 937
174
353362
456
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
FREQ.
FREQ. AC.
0 1
3
0
2
3
2
1
5
3 4 5 6 7 8 9
3 1 4 1 2
106 149
2 1
191715
INDICA O NÚMERO DE OCORRÊNCIAS DAS CHAVES
INDICA A POSIÇAÕ INICIAL DE CADA ESCANINHO
{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);varc2: vet; f, fac: vet2; v: 0..9; i: 0..n1; k: 0..9999;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}
top related