Ordenção por Fusão Fusão (Interlção) Prof. Dr. José Augusto Brnuss DFM-FFCRP-USP Est ul ntroduz métodos de ordenção por A é utlzd qundo dus ou ms seqüêns enontrm-se ordends O oetvo é nterlr s seqüêns ordends em um seqüên ordend ún 1 A plção de lgortmos de ordenção é mprtável, se os ddos não estverem em memór prnpl, ms sm em dsos ou fts Nesse so, os ddos são desrtos n form de rquvos seqüens u rteríst é que, d nstnte, é possível o esso (dreto) um e somente um dos seus omponentes Isso é um restrção sever, se omprd om s posslddes ofereds pel estrutur de vetor A operção de omn dus ou ms seqüêns ordends pr formr um ún seqüên ordend trvés d plção de repetds seleções entre os elementos essíves d momento Assm sendo, operção de é muto ms smples que de ordenção, sendo empregd omo operção uxlr no proesso ms omplexo de ordenção seqüenl. 2 Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] 2 3 4 Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] 2 3 2 3 4 5 6 1
Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] 2 3 4 5 2 3 4 5 6 7 8 Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] 2 3 4 5 6 7 2 3 4 5 6 7 8 9 10 Se [] < [] então [] deve ser nserdo em [] senão [] deve ser nserdo em [] =6 Um dos vetores ( ou ) pode ter um número menor de elementos do que o outro vetor, ou se, N M. Nesse so, o termnr um dos vetores, os dems elementos do outro vetor deverão ser opdos pr o vetor destno 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 10 11 12 2
=6 Um dos vetores ( ou ) pode ter um número menor de elementos do que o outro vetor, ou se, N M. Nesse so, o termnr um dos vetores, os dems elementos do outro vetor deverão ser opdos pr o vetor destno =6 Um dos vetores ( ou ) pode ter um número menor de elementos do que o outro vetor, ou se, N M. Nesse so, o termnr um dos vetores, os dems elementos do outro vetor deverão ser opdos pr o vetor destno 2 3 4 5 6 7 8 9 10 11 2 3 4 5 6 7 8 9 10 11 13 13 14 =6 Um dos vetores ( ou ) pode ter um número menor de elementos do que o outro vetor, ou se, N M. Nesse so, o termnr um dos vetores, os dems elementos do outro vetor deverão ser opdos pr o vetor destno =6 Um dos vetores ( ou ) pode ter um número menor de elementos do que o outro vetor, ou se, N M. Nesse so, o termnr um dos vetores, os dems elementos do outro vetor deverão ser opdos pr o vetor destno =9 2 3 4 5 6 7 8 9 10 11 13 15 2 3 4 5 6 7 8 9 10 11 13 15 17 15 16 Algortmo de Fusão (3 vetores) Algortmo de Fusão (2 vetores) nt,,; = 1; = 1; = 0; whle ( <= N && <= M) { ++; f([] < []) { [] = []; ++; { [] = []; ++; // # > # // opr resto de p/ whle ( <= N) { ++; [] = []; ++; // # > # // opr resto de p/ whle ( <= M) { ++; [] = []; ++; Ao térmno, =N+M que é o número de elementos do vetor 17 Este mesmo lgortmo pode ser flmente lterdo pr stução n qul os elementos serem nterldos enontrmse em um mesmo vetor Nesse so, desemos nterlr s seqüêns ordends [],..., [h] e [h+1],..., [R] pr oter o vetor [],..., [R] tmém ordendo 18 3
Algortmo de Fusão (2 vetores) Algortmo de Fusão (2 vetores) vod merge(tem [], nt, nt h, nt R, tem []) /* pré:([],...,[h]) e ([h+1],...,[r]) são dus seqüêns ordends om hves []... [h] e [h+1]... [R] Por exemplo: h h+1 R 12 1 3 5 7 13 15 17 pós:([],...,[h]) e ([h+1],...,[r]) são nterlds pr oter seqüên ([],...,[R]) tl que []... [R] Por exemplo: */ R 10 12 13 15 17 19 vod merge(tem [], nt, nt h, nt R, tem []) /* pré:([],...,[h]) e ([h+1],...,[r]) são dus seqüêns ordends om hves []... [h] e [h+1]... [R] pós:([],...,[h]) e ([h+1],...,[r]) são nterlds pr oter seqüên ([],...,[R]) tl que []... [R] */ { nt,,; = ; = h+1; = -1; whle ( <= h && <= R) { ++; f([] < []) { [] = []; ++; { [] = []; ++; whle ( <= h) { ++; [] = []; ++; whle ( <= R) { ++; [] = []; ++; 20 Fusão: Análse Em d terção do lço whle nrement de 1 O nremento totl é R-+1 Portnto, o lço será nrementdo no máxmo R- +1 vezes O omndo f move, no máxmo, um elemento por terção Por sso, o tempo totl é O(R-+1) Repre que R-+1 é quntdde de elementos serem nterldos. No so de todo o vetor (=1 e R=N), temos O(N) Ordenção por Fusão Dret 1. Dvdr seqüên nl em dus metdes, hmds e ; 2. Fundr e por meo d omnção de elementos soldos pr formrem pres ordendos; 3. Denomnr seqüên ssm otd e repetr os pssos 1 e 2, dest vez efetundo de pres ordendos em quádrupls ordends; 4. Repetr os pssos nterores, exeutndo de quádrupls em ótupls, e ssm prossegundo duplndo d vez o omprmento ds suseqüêns envolvds no proesso de, té que tod seqüên este ordend. 21 22 (1º psso) Consdere o vetor (2º psso) Dvdndo-se o meo 45 56 12 43 95 19 8 67 45 95 19 56 8 12 43 67 que é prtondo em otém-se 45 56 12 43 45 95 19 56 95 19 8 67 A de elementos soldos em pres ordendos result em 45 95 19 56 8 12 43 67 8 12 43 67 A de pres ordendos em quádrupls result em 8 12 45 95 19 43 56 67 23 24 4
(3º psso) Um terer dvsão o meo de result em 8 12 45 95 19 43 56 67 A de quádupls ordends em ótupls result em 8 12 45 95 19 43 56 67 8 12 19 43 45 56 67 95 Ordenção por Fusão Dret No ontexto do lgortmo de, d operção que trt de um só vez todo o onunto de ddos é denomnd fse, e o menor suproesso que, por su repetção suessv, mplement o proesso de ordenção proprmente dto é hmdo psso ou estágo No exemplo nteror, ordenção fo relzd em três pssos, d qul onsstndo de um fse de prtção e um fse de Como pode ser oservdo, pr que se possível relzção d ordenção são neessárs três seqüêns 25 26 Ordenção por Fusão Dret N reldde, s fses de prtonmento não ofereem nenhum ontrução o proesso de ordenção Esss fses onsttuem metde de tods s operções de movmentções e podem ser elmnds trvés d omnção d fse de prtonmento om de Ao nvés de efetur um pr produzr um seqüên ún, o resultdo do proesso de é medtmente redstruído em dus seqüêns, s qus onstturão s s de ddos que lmentrão os psso segunte Em ontrste om ordenção desrt m por de dus fses, este novo método é denomndo de fse ún ou lned Tl método é superor o nteror, um vez que são neessárs somente metde ds operções de movmentções exgds no outro so O preço dest vntgem é um qurt seqüên 27 Ordenção por Fusão (2 vetores) A lssfção por nterlção onsste em várs pssgens sore os elementos serem lssfdos N prmer pssgem, são nterlds seqüêns de tmnho 1, n segund o tmnho ds seqüêns é 2 e n -ésm pssgem s seqüêns nterlds são de tmnho 2-1 O lgortmo mpss relz um pssgem de ordenção por 28 Pssgem de Ordenção Pssgem de Ordenção vod mpss(tem [], nt N, nt p, tem []) /* pré: N>0 é o número de elementos do vetor e p é o tmnho ds suseqüêns de que serão nterlds pós: Interl pres dentes de omprmento p d seqüên pr */ { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; // nterrlr restnte de omprmento < 2*p f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; 29 vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; N-2p+1 +p-1 +2p-1 30 5
Pssgem de Ordenção Pssgem de Ordenção vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; vod merge(tem [], nt, nt h, nt R, tem []) f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; N-2p+1 vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; h h+1 R N-2p+1 +p-1 +2p-1 +p-1 +2p-1 31 32 Pssgem de Ordenção Pssgem de Ordenção vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; h h+1 R N-2p+1 vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; h h+1 R N-2p+1 +p-1 +2p-1 1 2 4 5 +p-1 +2p-1 1 2 4 5 33 34 Pssgem de Ordenção Pssgem de Ordenção vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; h h+1 R N-2p+1 vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; h h+1 N-2p+1 R +p-1 +2p-1 1 2 4 5 3 7 15 17 +p-1 +2p-1 1 2 4 5 3 7 15 17 35 36 6
Pssgem de Ordenção Pssgem de Ordenção vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; h h+1 R N-2p+1 +p-1 +2p-1 1 2 4 5 3 7 15 17 6 8 12 13 37 vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; N-2p+1 +p-1 1 2 4 5 3 7 15 17 6 8 12 13 38 Pssgem de Ordenção Pssgem de Ordenção vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; N-2p+1 +p-1 1 2 4 5 3 7 15 17 6 8 12 13 10 39 vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; h h+1 R +p-1 1 2 4 5 3 7 15 17 6 8 12 13 10 40 Pssgem de Ordenção Ordenção por Fusão vod mpss(tem [], nt N, nt p, tem []) { nt,; = 1; whle ( <= N-2*p+1) { merge(,,+p-1,+2*p-1,); = + 2*p; f(+p-1 < N) merge(,,+p-1,n,); for(=; <= N; ++) [] = []; Térmno d pssgem pr vod Mergesort(tem [], nt N) { nt,p; tem [Mx]; // é um vetor uxlr e Mx é o tmnho máxmo de p = 1; whle (p < N) { mpss(,n,p,); p = 2*p; mpss(,n,p,); p = 2*p; 1 2 4 5 3 7 15 17 6 8 12 13 10 41 4 2 5 1 17 3 7 15 12 6 13 8 10 42 7
Ordenção por Fusão Ordenção por Fusão vod Mergesort(tem [], nt N) { nt,p; tem [Mx]; // é um vetor uxlr e Mx é o tmnho máxmo de vod Mergesort(tem [], nt N) { nt,p; tem [Mx]; // é um vetor uxlr e Mx é o tmnho máxmo de p = 1; whle (p < N) { mpss(,n,p,); p = 2*p; mpss(,n,p,); p = 2*p; p = 1; whle (p < N) { mpss(,n,p,); p = 2*p; mpss(,n,p,); p = 2*p; 1 2 4 5 3 7 15 17 6 8 12 13 10 1 2 4 5 3 7 15 17 6 8 12 13 10 7 15 17 6 8 10 12 13 43 44 Ordenção por Fusão Exerío vod Mergesort(tem [], nt N) { nt,p; tem [Mx]; // é um vetor uxlr e Mx é o tmnho máxmo de p = 1; whle (p < N) { mpss(,n,p,); p = 2*p; mpss(,n,p,); p = 2*p; 7 15 17 6 8 10 12 13 10 12 13 15 17 vod Mergesort(tem [], nt N) { nt,p; tem [Mx]; p = 1; whle (p < N) { mpss(,n,p,); p = 2*p; mpss(,n,p,); p = 2*p; Utlzndo o lgortmo Mergesort, otenh o número de omprções e movmentções em d psso (p) pr os seguntes vetores 45,56,12,43,95,19,8,67 8,12,19,43,45,56,67,95 95,67,56,45,43,19,12,8 19,12,8,45,43,56,67,95 45 46 Solução Ordenção por Fusão: Análse p C M 45 56 12 43 95 19 8 67 1 4 8 45 56 12 43 19 95 8 67 2 5 8 12 43 45 56 8 19 67 95 4 6 8 8 12 19 43 45 56 67 95 8 0 8 8 12 19 43 45 56 67 95 15 32 p C M 19 12 8 45 43 56 67 95 1 4 8 12 19 8 45 43 56 67 95 2 5 8 8 12 19 45 43 56 67 95 4 5 8 8 12 19 43 45 56 67 95 8 0 8 8 12 19 43 45 56 67 95 14 32 p C M 8 12 19 43 45 56 67 95 1 4 8 8 12 19 43 45 56 67 95 2 4 8 8 12 19 43 45 56 67 95 4 4 8 8 12 19 43 45 56 67 95 8 0 8 8 12 19 43 45 56 67 95 12 32 p C M 95 67 56 45 43 19 12 8 1 4 8 67 95 45 56 19 43 8 12 2 4 8 45 56 67 95 8 12 19 43 4 4 8 8 12 19 43 45 56 67 95 8 0 8 8 12 19 43 45 56 67 95 12 32 São efetuds, no totl, log 2 N pssgens sore os ddos. Com dos rquvos podem ser nterldos em tempo lner (lgortmo merge), d pssgem de ordenção por nterlção tom o tempo O(N) Como exstem log 2 N pssgens, o tempo totl é O(N log 2 N) Entretnto, exstem hmds de proedmento envolvds no proesso, o que, normlmente, rret um esforço omputonl mor O lgortmo segunte, lém de mplementr ordenção por nterlção utlzndo um úno vetor, o fz em um úno lgortmo (sem hmds de proedmento) 47 48 8
Um úno vetor pode ser flmente utlzdo pr representr dus seqüêns, se for nterpretdo omo um estrutur de ddos om dus extremddes Ao nvés de se efetur prtr dos ddos provenentes de dos onuntos-s, os elementos são extrídos ds dus extremddes do vetor Assm, form gerl d fse omnd de prtção- pode ser lustrd pel fgur segunte destno prtção 49 50 prtção prtção destno 2 destno 51 52 prtção prtção 2 10 destno 2 10 destno 53 54 9
prtção prtção destno 2 10 4 destno 2 10 13 4 55 56 prtção prtção destno 2 10 13 4 destno 2 10 1 13 4 57 58 prtção prtção destno 2 10 1 8 13 4 destno 2 10 1 8 13 4 59 60 10
prtção prtção destno 2 10 1 8 5 13 4 destno 2 10 1 8 12 5 13 4 61 62 prtção prtção destno 2 10 1 8 12 5 13 4 destno 2 10 1 8 3 12 5 13 4 63 64 prtção prtção destno 2 10 1 8 3 6 12 5 13 4 destno 2 10 1 8 3 6 12 5 13 4 65 66 11
prtção prtção destno 2 10 1 8 3 6 15 12 5 13 4 destno 2 10 1 8 3 6 17 15 12 5 13 4 67 68 prtção prtção destno 2 10 1 8 3 6 17 15 12 5 13 4 destno 69 70 Térmno d pssgem Destno torn-se pr nov pssgem prtção prtção destno destno 71 72 12
prtção prtção 2 destno 2 4 destno 73 74 prtção prtção 2 4 10 destno 2 4 10 13 destno 75 76 prtção prtção 2 4 10 13 destno destno 2 4 10 13 1 77 78 13
prtção prtção destno 2 4 10 13 5 1 destno 2 4 10 13 8 5 1 79 80 prtção prtção destno 2 4 10 13 12 8 5 1 destno 2 4 10 13 12 8 5 1 81 82 prtção prtção destno 2 4 10 13 3 12 8 5 1 destno 2 4 10 13 3 6 12 8 5 1 83 84 14
prtção prtção destno 2 4 10 13 3 6 15 12 8 5 1 destno 2 4 10 13 3 6 15 17 12 8 5 1 85 86 prtção prtção destno 2 4 10 13 3 6 15 17 12 8 5 1 destno 87 88 Térmno d pssgem Destno torn-se pr nov pssgem prtção prtção destno destno 89 90 15
prtção prtção 1 destno 1 2 destno 91 92 prtção prtção 1 2 4 destno 1 2 4 5 destno 93 94 prtção prtção 1 2 4 5 8 destno 1 2 4 5 8 10 destno 95 96 16
prtção prtção destno 1 2 4 5 8 10 12 destno 1 2 4 5 8 10 12 13 97 98 prtção prtção destno 1 2 4 5 8 10 12 13 destno 1 2 4 5 8 10 12 13 3 99 100 prtção prtção destno 1 2 4 5 8 10 12 13 6 3 destno 1 2 4 5 8 10 12 13 7 6 3 101 102 17
prtção prtção destno 1 2 4 5 8 10 12 13 15 7 6 3 destno 103 104 Térmno d pssgem Destno torn-se pr nov pssgem prtção prtção destno destno 105 106 prtção prtção 1 destno 1 2 destno 107 108 18
prtção prtção 1 2 3 destno 1 2 3 4 destno 109 110 prtção prtção destno 6 destno 111 112 prtção prtção destno 6 7 destno 113 114 19
prtção prtção destno 10 destno 10 12 115 116 prtção prtção destno 10 12 13 destno 10 12 13 15 117 118 Térmno d pssgem Vetor Ordendo prtção prtção destno 10 12 13 15 17 destno 10 12 13 15 17 119 120 20
Resumo Aprentemente, o lgortmo de ordenção por é stnte ompettvo, mesmo qundo omprdo os métodos ms sofstdos de ordenção vstos ns uls nterores Entretnto, sorerg gerl neessár à mnpulção de índes é reltvmente lt e um desvntgem desv é neessdde de um áre de rmzenmento de 2N elementos Est é rzão pel qul ordenção por rrmente é utlzd pr vetores, sto é, pr ddos rmzendos em memór prnpl 121 21