Você está na página 1de 30

Estrutura de

Dados Bsicas I.
Aula 10 Algoritmos de ordenao IV
Prof. Eiji Adachi M. Barbosa

Avisos
Prova ser no dia 15/09/2016

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

Objetivos
Apresentar e implementar algoritmo de
ordenao por intercalao (Merge sort)

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

Referncia extra
Notas de aula Anlise de algoritmos, prof. Paulo
Feofiloff, IME-USP:
http://www.ime.usp.br/~pf/algoritmos/aulas/mrgsrt.html

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

ORDENAO POR
INTERCALAO

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

Ideia geral
A partir de dois vetores ordenados, posso
construir um outro tambm ordenado
v1 1
w

3
1

Turma 3 - 2016.1

3
2

5
3

7
3

v2 2

9 10

IMD0029 - EDB1 - Prof. Eiji Adachi

9 10

Ideia geral Intercalao


v

v1

Turma 3 - 2016.1

9 10

v2

IMD0029 - EDB1 - Prof. Eiji Adachi

Ideia geral Intercalao


fim1

1
i

tmp

fim2

9 10

k
i: elemento atual de v1
j: elemento atual de v2
k: 1 posio livre de tmp

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

Ideia geral Intercalao


fim1

tmp

fim2

9 10

SE v[i] v[j] ENTO ?

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

Ideia geral Intercalao


fim1

tmp

fim2

9 10

1
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

10

Ideia geral Intercalao


fim1

tmp

fim2

9 10

2
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

11

Ideia geral Intercalao


fim1

tmp

fim2

9 10

3
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

12

Ideia geral Intercalao


fim1

tmp

fim2

9 10

3
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

13

Ideia geral Intercalao


fim1

fim2

tmp

9 10

3
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

14

Ideia geral Intercalao


fim1

fim2

tmp

9 10

5
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

15

Ideia geral Intercalao


fim1

fim2

tmp

9 10

7
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

16

Ideia geral Intercalao


fim1

J percorreu todo v1!

tmp

fim2

9 10

7
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

17

Ideia geral Intercalao


fim1

fim2

tmp

9 10

7
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

ENQUANTO j fim2 FAA:


tmp[k] = j
k = k+1, j = j+1
FIM_ENQUANTO

IMD0029 - EDB1 - Prof. Eiji Adachi

18

Ideia geral Intercalao


fim1

fim2

tmp

9 10
j

7
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

ENQUANTO j fim2 FAA:


tmp[k] = j
k = k+1, j = j+1
FIM_ENQUANTO

IMD0029 - EDB1 - Prof. Eiji Adachi

19

Ideia geral Intercalao


fim1

fim2

9 10

tmp

9
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

ENQUANTO j fim2 FAA:


tmp[k] = j
k = k+1, j = j+1
FIM_ENQUANTO

IMD0029 - EDB1 - Prof. Eiji Adachi

20

Ideia geral Intercalao


fim1

fim2

9 10

tmp

9 10
k

SE v[i] v[j] ENTO :


tmp[k] = v[i], i = i +1, k = k+1
SENO :
tmp[k] = v[j], j = j+1, k = k+1
Turma 3 - 2016.1

ENQUANTO j fim2 FAA:


tmp[k] = j
k = k+1, j = j+1
FIM_ENQUANTO

IMD0029 - EDB1 - Prof. Eiji Adachi

21

Intercalar( v[n], inicio1, inicio2, fim2 ) :


fim1 = inicio2-1, i = inicio1, j=inicio2, k=0
WHILE i fim1 && j fim2 :
IF v[i] v[j] :
tmp[k] = v[i], i = i+1
ELSE:
tmp[k] = v[j], j = j+1
END_IF
k = k+1
END_WHILE
WHILE i fim1:
tmp[k] = v[i], i = i+1, k=k+1
END_WHILE
WHILE j fim2 :
tmp[k] = v[j], j = j+1, k=k+1
Qual a complexidade
END_WHILE
(pior e melhor caso)?
COPY tmp IN v
FIMTurma 3 - 2016.1
IMD0029 - EDB1 - Prof. Eiji Adachi
22

Intercalao

J sei intercalar,
mas como
conseguir dois
vetores ordenados?
Qual o caso trivial do vetor ordenado?

2016.1

IMD0408 - Processos de Software Prof. Eiji Adachi M. Barbosa

23

Ordenao por intercalao


Estratgia Dividir para conquistar:
Dividir:
Dividir o vetor ao meio sucessivamente, at chegar a um vetor
de tamanho 1

Conquistar:
Intercalar vetores de tamanho 1, formando vetores de tamanho
2
Intercalar vetores de tamanho 2, formando vetores de tamanho
4
Intercalar vetores de tamanho 4, formando vetores de tamanho
8
...
Intercalar vetores de tamanho n/2, formando vetor de tamanho n
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

24

Ordenao por intercalao


OrdenarIntercalacao( v[1...n], esquerda, direita ) :
SE esquerda < direita ENTO :
meio = (direita+esquerda)/2
OrdenarIntercalacao( v, esquerda, meio )
OrdenarIntercalacao( v, meio+1, direita )
Intercalar(v, esquerda, meio+1, direita)
FIM_SE
FIM

Qual a complexidade
(pior e melhor caso)?
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

25

Ordenao por intercalao

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

26

Ordenao por intercalao


Custo total:
T(n) = 2*T(n/2) + n

Dividindo por n:
T(n) / n = T(n/2) / (n/2) + 1
...
T(n)/n = T(1)/1 + log2n
T(n) = n * (1 + log2n)
T(n) = n + n*log2n
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

27

Ordenao por intercalao


Pior e melhor caso: (n*log2n)

Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

28

Observao sobre copy do


algoritmo de intercalao
Na ltima linha do algoritmo de intercalao, feita a cpia dos
elementos do array auxiliar tmp para o array de entrada v. Deve-se
atentar ao fato de que so manipulados apenas os elementos de v
que esto compreendidos entre [inicio1, fim2] e que este intervalo
no necessariamente entre [0,n-1] ao longo das chamadas
recursivas do merge sort. Isto quer dizer que se deve tomar cuidado
com a cpia dos elementos de tmp para v. A cpia deve ser feita da
seguinte forma:
for(i = inicio1, j = 0; i <= fim2; i++, j++)!
{!
v[i] = tmp[j];!
}
Turma 3 - 2016.1

IMD0029 - EDB1 - Prof. Eiji Adachi

29

Estrutura de
Dados Bsicas I.
Aula 9 Algoritmos de ordenao II
Prof. Eiji Adachi M. Barbosa