ORDENAÇÃO DE DADOS INTERCALAÇÃO - MERGESORT ALUNOS: JORLAN TEIXEIRA COSTA N O : 9908802701

Preview:

DESCRIPTION

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 N O : 9908802701 - PowerPoint PPT Presentation

Citation preview

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}

Recommended