Busca e Ordenação
Rodrigo
Rocha
1
Busca
2
3
3
3
3
Busca: definição
4
Busca: definição
Entrada:
4
Busca: definição
Entrada:
vetor x, com n elementos
4
Busca: definição
Entrada:
vetor x, com n elementos
elemento a ser buscado
4
Busca: definição
Entrada:
vetor x, com n elementos
elemento a ser buscado
Saída:
4
Busca: definição
Entrada:
vetor x, com n elementos
elemento a ser buscado
Saída:
índice (posição) do elemento no vetor
4
Busca: definição
Entrada:
vetor x, com n elementos
elemento a ser buscado
Saída:
índice (posição) do elemento no vetor
-1, se o elemento não for encontrado
4
Vetores
12 74 12 19 2223x =
5
Vetores
12 74 12 19 2223x =
n = 6 (quantidade de elementos no vetor x)
5
Vetores
12 74 12 19 2223x =
0 1 2 3 4 5
n = 6 (quantidade de elementos no vetor x)
índices
5
Vetores
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
n = 6 (quantidade de elementos no vetor x)
índices
índices
5
Vetores
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
n = 6 (quantidade de elementos no vetor x)
x[0] = 23 (primeiro elemento de x)
índices
índices
5
Vetores
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
n = 6 (quantidade de elementos no vetor x)
x[0] = 23 (primeiro elemento de x)
x[n-1] = 22 (último elemento de x)
índices
índices
5
Entrada/Saída
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
6
Entrada/Saída
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
busca(x, 23)
6
Entrada/Saída
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
busca(x, 23) → 0
6
Entrada/Saída
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
busca(x, 23)
busca(x, 19)
→ 0
6
Entrada/Saída
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
busca(x, 23)
busca(x, 19)
→ 0
→ 4
6
Entrada/Saída
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
busca(x, 23)
busca(x, 19)
busca(x, 33)
→ 0
→ 4
6
Entrada/Saída
12 74 12 19 2223x =
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
busca(x, 23)
busca(x, 19)
busca(x, 33)
→ 0
→ 4
→ -1 (não encontrado)
6
Algoritmos
Busca linear

(ou busca sequencial)
Busca binária
7
Busca linear
8
Intuição
• Para cada elemento do vetor:
9
Intuição
• Para cada elemento do vetor:
• Compara com o elemento buscado
9
Intuição
• Para cada elemento do vetor:
• Compara com o elemento buscado
• Se o elemento for igual ao buscado, 

retorna o índice do elemento
9
Algoritmo (em Python)
def seq(start, stop, step=1):
dir = 1 if (step > 0) else -1
return range(start, stop + dir, step)
10
Algoritmo (em Python)
def buscaLinear(x, elem):
def seq(start, stop, step=1):
dir = 1 if (step > 0) else -1
return range(start, stop + dir, step)
10
Algoritmo (em Python)
def buscaLinear(x, elem):
n = len(x)
def seq(start, stop, step=1):
dir = 1 if (step > 0) else -1
return range(start, stop + dir, step)
10
Algoritmo (em Python)
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
def seq(start, stop, step=1):
dir = 1 if (step > 0) else -1
return range(start, stop + dir, step)
10
Algoritmo (em Python)
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
if x[i] == elem:
def seq(start, stop, step=1):
dir = 1 if (step > 0) else -1
return range(start, stop + dir, step)
10
Algoritmo (em Python)
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
if x[i] == elem:
return i
def seq(start, stop, step=1):
dir = 1 if (step > 0) else -1
return range(start, stop + dir, step)
10
Algoritmo (em Python)
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
if x[i] == elem:
return i
return -1
def seq(start, stop, step=1):
dir = 1 if (step > 0) else -1
return range(start, stop + dir, step)
10
Complexidade
Complexidade de tempo
Complexidade de espaço
11
Complexidade
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
if x[i] == elem:
return i
return -1
12
Complexidade
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
if x[i] == elem:
return i
return -1
12
Complexidade
Melhor caso: 1 comparação (elem == x[0])
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
if x[i] == elem:
return i
return -1
12
Complexidade
Melhor caso: 1 comparação (elem == x[0])
Pior caso: n comparações (elem não encontrado)
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
if x[i] == elem:
return i
return -1
12
Complexidade
Melhor caso: 1 comparação (elem == x[0])
Pior caso: n comparações (elem não encontrado)
Caso médio: n/2 comparações
def buscaLinear(x, elem):
n = len(x)
for i in seq(0, n - 1): # 0, 1, ..., n-1
if x[i] == elem:
return i
return -1
12
Complexidade
13
Complexidade
• O tempo de execução da busca linear, no pior
caso, tende a ser proporcional ao número de
elementos, n.
13
Complexidade
• O tempo de execução da busca linear, no pior
caso, tende a ser proporcional ao número de
elementos, n.
• Em outras palavras, o tempo de execução é O(n).
13
Complexidade
• O tempo de execução da busca linear, no pior
caso, tende a ser proporcional ao número de
elementos, n.
• Em outras palavras, o tempo de execução é O(n).
• O espaço de armazenamento é constante, não
depende do tamanho do vetor.
13
Complexidade
• O tempo de execução da busca linear, no pior
caso, tende a ser proporcional ao número de
elementos, n.
• Em outras palavras, o tempo de execução é O(n).
• O espaço de armazenamento é constante, não
depende do tamanho do vetor.
• Em outras palavras, a complexidade de espaço é
O(1).
13
Discussão
Quantas comparações precisamos fazer,

no pior caso, para buscar um elemento 

em uma lista de 1 milhão de elementos?
14
Discussão
15
Discussão
Vamos assumir que os elementos do vetor de 1
milhão de elementos estão em ordem crescente.
15
Discussão
Vamos assumir que os elementos do vetor de 1
milhão de elementos estão em ordem crescente.
É possível buscar um elemento com menos de 1
milhão comparações (no pior caso)?
15
Discussão
Vamos assumir que os elementos do vetor de 1
milhão de elementos estão em ordem crescente.
É possível buscar um elemento com menos de 1
milhão comparações (no pior caso)?
Como você busca uma palavra em um
dicionário?
15
Busca
16
Intuição
• Olhar o elemento do meio da lista
Ver animação interativa (buscar 67, 59, 60…)
17
Intuição
• Olhar o elemento do meio da lista
• Comparar com o elemento que estamos buscando
(<, >, =)
Ver animação interativa (buscar 67, 59, 60…)
17
Intuição
• Olhar o elemento do meio da lista
• Comparar com o elemento que estamos buscando
(<, >, =)
• Continuar procurando apenas na metade em que o
elemento pode estar
Ver animação interativa (buscar 67, 59, 60…)
17
Algoritmo
18
Algoritmo
def buscaBinaria(x, elem):
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
meio = int((esq + dir) / 2)
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
meio = int((esq + dir) / 2)
if (x[meio] == elem):
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
meio = int((esq + dir) / 2)
if (x[meio] == elem):
return meio
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
meio = int((esq + dir) / 2)
if (x[meio] == elem):
return meio
elif (elem < x[meio]):
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
meio = int((esq + dir) / 2)
if (x[meio] == elem):
return meio
elif (elem < x[meio]):
dir = meio - 1
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
meio = int((esq + dir) / 2)
if (x[meio] == elem):
return meio
elif (elem < x[meio]):
dir = meio - 1
else:
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
meio = int((esq + dir) / 2)
if (x[meio] == elem):
return meio
elif (elem < x[meio]):
dir = meio - 1
else:
esq = meio + 1
18
Algoritmo
def buscaBinaria(x, elem):
n = len(x)
esq = 0
dir = n - 1
while (esq <= dir):
meio = int((esq + dir) / 2)
if (x[meio] == elem):
return meio
elif (elem < x[meio]):
dir = meio - 1
else:
esq = meio + 1
return -1 18
Complexidade
19
Complexidade
0: n
19
Complexidade
0: n
1: n / 2
19
Complexidade
0: n
1: n / 2
2: n / 4
19
Complexidade
0: n
1: n / 2
2: n / 4
3: n / 8
19
Complexidade
0: n
1: n / 2
2: n / 4
3: n / 8
.
.
.
.
.
.
19
Complexidade
0: n
1: n / 2
2: n / 4
3: n / 8
k: 1
.
.
.
.
.
.
19
Complexidade
0: n n / 20
n / 21
n / 22
n / 23
n / 2k
=
=
=
=
=
1: n / 2
2: n / 4
3: n / 8
k: 1
.
.
.
.
.
.
19
Complexidade
0: n n / 20
n / 21
n / 22
n / 23
n / 2k
=
=
=
=
=
1 = n / 2k
1: n / 2
2: n / 4
3: n / 8
k: 1
.
.
.
.
.
.
19
Complexidade
0: n n / 20
n / 21
n / 22
n / 23
n / 2k
=
=
=
=
=
1 = n / 2k
2k = n
1: n / 2
2: n / 4
3: n / 8
k: 1
.
.
.
.
.
.
19
Complexidade
0: n n / 20
n / 21
n / 22
n / 23
n / 2k
=
=
=
=
=
1 = n / 2k
2k = n
k = log2(n)
1: n / 2
2: n / 4
3: n / 8
k: 1
.
.
.
.
.
.
19
Complexidade
0: n n / 20
n / 21
n / 22
n / 23
n / 2k
=
=
=
=
=
1 = n / 2k
2k = n
k = log2(n)
1: n / 2
2: n / 4
3: n / 8
k: 1
.
.
.
.
.
.
O(log n)
19
Confronto
20
n (tamanho do vetor)
tempo de
execução
busca linear
busca binária
Confronto
21
Confronto
22
Confronto
Entrada: vetor de 1 milhão de elementos
22
Confronto
Entrada: vetor de 1 milhão de elementos
Busca linear:
22
Confronto
Entrada: vetor de 1 milhão de elementos
Busca linear:
1 milhão de comparações
22
Confronto
Entrada: vetor de 1 milhão de elementos
Busca linear:
1 milhão de comparações
Busca binária:
22
Confronto
Entrada: vetor de 1 milhão de elementos
Busca linear:
1 milhão de comparações
Busca binária:
21 comparações
22
Confronto
Entrada: vetor de 1 milhão de elementos
Busca linear:
1 milhão de comparações
Busca binária:
21 comparações
E se fossem 2 milhões de elementos?
22
Discussão
23
Discussão
• Busca binária é mais rápida, mas requer vetor
ordenado
23
Discussão
• Busca binária é mais rápida, mas requer vetor
ordenado
• Se você pretende fazer muitas buscas no mesmo
vetor, pode valer a pena ordenar o vetor
23
Discussão
• Busca binária é mais rápida, mas requer vetor
ordenado
• Se você pretende fazer muitas buscas no mesmo
vetor, pode valer a pena ordenar o vetor
• Qual a complexidade de se ordenar um vetor?
23
Ordenação
24
25
26
Definição
27
Definição
Entrada:
27
Definição
Entrada:
vetor x, com n elementos
27
Definição
Entrada:
vetor x, com n elementos
Saída:
27
Definição
Entrada:
vetor x, com n elementos
Saída:
vetor x nos quais as posições dos elementos foram
trocadas de forma que

x[0] ≤ x[1] ≤ x[2] ≤ x[3] ≤ … ≤ x[n-1]
27
28
29
30
31
32
33
Comparar dois
elementos de cada vez
33
Comparar dois
elementos de cada vez
Trocar a posição
de dois elementos
33
! % $ # @
34
! %
$ # @
35
!
%
$ # @
36
!%
$ # @
37
!% $ # @
38
Para que estudar

algoritmos de ordenação?
• A maioria das linguagens já implementa algoritmos de
ordenação
39
Para que estudar

algoritmos de ordenação?
• A maioria das linguagens já implementa algoritmos de
ordenação
• Algoritmos de ordenação são bons objetos de estudo:
39
Para que estudar

algoritmos de ordenação?
• A maioria das linguagens já implementa algoritmos de
ordenação
• Algoritmos de ordenação são bons objetos de estudo:
• ordenação é um problema que já foi muito estudado
39
Para que estudar

algoritmos de ordenação?
• A maioria das linguagens já implementa algoritmos de
ordenação
• Algoritmos de ordenação são bons objetos de estudo:
• ordenação é um problema que já foi muito estudado
• os algoritmos apresentam dificuldade média
39
Para que estudar

algoritmos de ordenação?
• A maioria das linguagens já implementa algoritmos de
ordenação
• Algoritmos de ordenação são bons objetos de estudo:
• ordenação é um problema que já foi muito estudado
• os algoritmos apresentam dificuldade média
• eles podem ser usados como base para outros
algoritmos especializados
39
Algoritmos Estudados
Básicos
Selection Sort

Bubble Sort

Insertion Sort
Avançados
Merge Sort (intuição)

Quick Sort (intuição)
40
Algoritmos

Básicos
Selection Sort
Bubble Sort
Insertion Sort
41
Algoritmos Básicos
Incrementais
Ordenação in-place
Não são rápidos quando
há muitos elementos
42
Ordenação Incremental
43
Ordenação Incremental
43
Ordenação Incremental
43
Ordenação Incremental
43
Selection Sort
44
Selection Sort
• http://algoviz.org/OpenDSA/Books/OpenDSA/html/SelectionSort.html
45
@ # $ % &!
maior
Selection Sort
• http://algoviz.org/OpenDSA/Books/OpenDSA/html/SelectionSort.html
45
@ # $ % &!
maior
Selection Sort
• http://algoviz.org/OpenDSA/Books/OpenDSA/html/SelectionSort.html
45
@ # $ % &!
maior
@ & $ % #!
maior
Selection Sort
• http://algoviz.org/OpenDSA/Books/OpenDSA/html/SelectionSort.html
45
@ # $ % &!
maior
@ & $ % #!
maior
Selection Sort
• http://algoviz.org/OpenDSA/Books/OpenDSA/html/SelectionSort.html
45
@ # $ % &!
maior
@ & $ % #!
maior
@ & % $ #!
…
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
Algoritmo
46
ultimo
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
imaior = indiceDoMaiorElemento(x, ultimo)
troca(x, imaior, ultimo)
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
Algoritmo
46
ultimo
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
imaior = indiceDoMaiorElemento(x, ultimo)
troca(x, imaior, ultimo)
def indiceDoMaiorElemento(x, ultimo):
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
return imaior
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
Algoritmo
46
ultimo
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
imaior = indiceDoMaiorElemento(x, ultimo)
troca(x, imaior, ultimo)
def indiceDoMaiorElemento(x, ultimo):
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
return imaior
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
Algoritmo
46
ultimo
Algoritmo
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
47
Algoritmo
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
47
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
48
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
48
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
quantidade de trocas (em qualquer caso): n - 1, que é O(n)
48
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
comparações:

(em qualquer caso)
49
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
comparações:

(em qualquer caso)
49
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
comparações:

(em qualquer caso)
(n-1)
49
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
comparações:

(em qualquer caso)
+(n-1) (n-2)
49
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
comparações:

(em qualquer caso)
+(n-1) (n-2) + …
49
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
comparações:

(em qualquer caso)
+(n-1) (n-2) + +… 2
49
Complexidade
def selectionSort(x):
n = len(x)
for ultimo in seq(n-1, 1, -1):
troca(x, imaior, ultimo)
imaior = 0
for i in seq(1, ultimo):
if x[i] > x[imaior]:
imaior = i
comparações:

(em qualquer caso)
+(n-1) (n-2) + + +… 2 1
49
Complexidade
comparações: +(n-1) (n-2) + + +… 2 1
(n - 1) parcelas
50
Complexidade
comparações: +(n-1)
(n-2) ++
+ …
2
1
(n-1)/2 pares
}
51
Complexidade
comparações: +(n-1)
(n-2) ++
+ …
2
1
(n-1)/2 pares
}
52
Complexidade
comparações: n
+
+ …
(n-1)/2 vezes
}n
53
Complexidade
comparações: n
+
+ …
(n-1)/2 vezes
}n
n (n-1)
2
———=
53
Complexidade
comparações: n
+
+ …
(n-1)/2 vezes
}n
n (n-1)
2
———=
= ½n² - ½n
53
Complexidade
comparações: n
+
+ …
(n-1)/2 vezes
}n
n (n-1)
2
———=
= ½n² - ½n
O(n²)
53
Complexidade
tempo gasto em comparações:
tempo gasto em trocas:
tempo total de execução é
~ ( ½n² - ½n )
~ ( n - 1 )
54
Complexidade
O(n²)
tempo gasto em comparações:
tempo gasto em trocas:
tempo total de execução é
~ ( ½n² - ½n )
~ ( n - 1 )
54
Bubble Sort
55
Intuição
Comparar cada
elemento com o próximo
http://algoviz.org/OpenDSA/Books/OpenDSA/html/BubbleSort.html56
Intuição
Comparar cada
elemento com o próximo
Se estiverem fora da
ordem, troca
http://algoviz.org/OpenDSA/Books/OpenDSA/html/BubbleSort.html56
Intuição
Comparar cada
elemento com o próximo
Se estiverem fora da
ordem, troca
Repete várias vezes até
o vetor ficar ordenado
http://algoviz.org/OpenDSA/Books/OpenDSA/html/BubbleSort.html56
Implementação 12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
57
Implementação
def bubbleSort(x):
for i in seq(0, penultimo):
if x[i] > x[i + 1]:
troca(x, i, i+1)
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
57
Implementação
def bubbleSort(x):
n = len(x)
for penultimo in seq(n-2, 0, -1):
for i in seq(0, penultimo):
if x[i] > x[i + 1]:
troca(x, i, i+1)
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
57
Complexidade
def bubbleSort(x):
n = len(x)
for penultimo in seq(n-2, 0, -1):
for i in seq(0, penultimo):
if x[i] > x[i + 1]:
troca(x, i, i+1)
58
otimização: flag
Complexidade
def bubbleSort(x):
n = len(x)
for penultimo in seq(n-2, 0, -1):
for i in seq(0, penultimo):
if x[i] > x[i + 1]:
troca(x, i, i+1)
58
otimização: flag
Complexidade
def bubbleSort(x):
n = len(x)
for penultimo in seq(n-2, 0, -1):
for i in seq(0, penultimo):
if x[i] > x[i + 1]:
troca(x, i, i+1)
comparações:
trocas: 0
O(n²)
O(n²)
O(n²)
pior

caso
melhor

caso
58
otimização: flag
Complexidade
def bubbleSort(x):
n = len(x)
for penultimo in seq(n-2, 0, -1):
for i in seq(0, penultimo):
if x[i] > x[i + 1]:
troca(x, i, i+1)
O(n²)
comparações:
trocas: 0
O(n²)
O(n²)
O(n²)
pior

caso
melhor

caso
58
otimização: flag
Curiosidade
https://www.youtube.com/watch?v=k4RRi_ntQc8
http://www.quora.com/What-is-the-most-efficient-way-to-sort-a-million-32-bit-integers
59
Insertion Sort
60
Intuição
61
Intuição
62
Intuição
63
Intuição
64
Intuição
65
Intuição
66
Intuição
67
Intuição
68
Intuição
68
Intuição
69
Intuição
70
Intuição
70
Intuição
>
70
Intuição
71
Intuição
71
Intuição
>
71
Intuição
72
Intuição
72
Intuição
>
72
Intuição
73
Intuição
73
Intuição
>
73
Intuição
73
Algoritmo
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
74
primeiro
Algoritmo
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
moveParaPosicaoCerta(x, primeiro)
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
74
primeiro
Algoritmo
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
moveParaPosicaoCerta(x, primeiro)
def moveParaPosicaoCerta(x, primeiro):
i = primeiro
while (i >= 1) and (x[i - 1] > x[i]):
troca(x, i - 1, i)
i = i - 1
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
74
primeiro
Algoritmo
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
moveParaPosicaoCerta(x, primeiro)
def moveParaPosicaoCerta(x, primeiro):
i = primeiro
while (i >= 1) and (x[i - 1] > x[i]):
troca(x, i - 1, i)
i = i - 1
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
74
primeiro
Algoritmo
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
def moveParaPosicaoCerta(x, primeiro):
i = primeiro
while (i >= 1) and (x[i - 1] > x[i]):
troca(x, i - 1, i)
i = i - 1
12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
74
primeiro
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
i = primeiro
while (i >= 1) and (x[i - 1] > x[i]):
troca(x, i - 1, i)
i = i - 1
Algoritmo 12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
75
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
i = primeiro
while (i >= 1) and (x[i - 1] > x[i]):
troca(x, i - 1, i)
i = i - 1
Algoritmo 12 74 42 19 2223
0 1 2 3 4 5
n-6 n-5 n-4 n-3 n-2 n-1
75
Complexidade
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
i = primeiro
while (i >= 1) and (x[i - 1] > x[i]):
troca(x, i - 1, i)
i = i - 1
76
Complexidade
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
i = primeiro
while (i >= 1) and (x[i - 1] > x[i]):
troca(x, i - 1, i)
i = i - 1
76
Complexidade
def insertionSort(x):
n = len(x)
for primeiro in seq(1, n-1):
i = primeiro
while (i >= 1) and (x[i - 1] > x[i]):
troca(x, i - 1, i)
i = i - 1
comparações:
trocas: 0
O(n)
O(n²)
O(n²)
pior

caso
melhor

caso
O(n²)
76
Discussão
E se usarmos busca binária para encontrar a
posição de inserção de cada elemento?
77
Confronto
78
Complexidade
• Todos os algoritmos possuem tempo de execução
O(n2) no pior caso
• Todos os algoritmos usam O(1) de espaço
79
https://vinayakgarg.wordpress.com/2011/10/25/time-comparison-of-quick-sort-insertion-sort-and-bubble-sort/
Benchmark
80
https://vinayakgarg.wordpress.com/2011/10/25/time-comparison-of-quick-sort-insertion-sort-and-bubble-sort/
Benchmark
80
Algoritmos

Avançados
Merge Sort
Quick Sort
81
Algoritmos Avançados
Dividir para conquistar
82
Algoritmos Avançados
Dividir para conquistar
Rápidos para vetores grandes
82
Algoritmos Avançados
Dividir para conquistar
Rápidos para vetores grandes
82
Merge Sort
83
Intuição
• Combinar dois vetores ordenados em um grande
vetor ordenado é rápido
http://algoviz.org/OpenDSA/Books/OpenDSA/html/Mergesort.html
84
Intuição
• Combinar dois vetores ordenados em um grande
vetor ordenado é rápido
http://algoviz.org/OpenDSA/Books/OpenDSA/html/Mergesort.html
84
Intuição
85
Intuição
• Um vetor com um elemento está sempre ordenado
85
Intuição
• Um vetor com um elemento está sempre ordenado
• Merge sort: dividir-para-conquistar
85
Intuição
• Um vetor com um elemento está sempre ordenado
• Merge sort: dividir-para-conquistar
• Dividir vetor no meio sucessivamente

até restarem só sub-vetores de um elemento
85
Intuição
• Um vetor com um elemento está sempre ordenado
• Merge sort: dividir-para-conquistar
• Dividir vetor no meio sucessivamente

até restarem só sub-vetores de um elemento
• Combinar dois vetores em vetor maior
85
Intuição
http://algoviz.org/OpenDSA/Books/OpenDSA/html/Mergesort.html
86
Algoritmo (ideia geral)
def mergeSort(x):
n = len(x)
mergeSortAux(x, 0, n - 1)
def mergeSortAux(x, inicio, final):
if final > inicio:
meio = int((inicio + final) / 2)
mergeSortAux(x, inicio, meio)
mergeSortAux(x, meio+1, final)
combinar(x, inicio, meio, final)
87
Complexidade
combinar:
n comparações
n/2 elementos n/2 elementos
n elementos
88
Complexidade
n
n / 2 n / 2
n / 4
1 …………………………..
n / 4 n / 4 n / 4
1 1 1
…
…
…
…
…
…
…
…
…
…
…
…
n comparações
n/2 comparações n/2 comparações
log2(n)
n log2(n)
n
+ n
n
…
+
+
+
……………… =
…… =
… =
89
Complexidade
Tempo de execução: O(n log2(n))
O(n log2(n)) < O(n2)
Para vetores muito pequenos, pode ser mais lento que os algoritmos básicos
90
Complexidade
Merge sort não é in-place:
Uma boa implementação usa espaço adicional
para n elementos
Complexidade de espaço: O(n)
91
Quick Sort
92
Intuição
Escolhe um elemento (chamaremos de pivô)
93
Intuição
Escolhe um elemento (chamaremos de pivô)
Coloca todos os elementos menores que o pivô à
esquerda dele
93
Intuição
Escolhe um elemento (chamaremos de pivô)
Coloca todos os elementos menores que o pivô à
esquerda dele
Coloca todos os elementos maiores que o pivô à
direita dele
93
Intuição
Escolhe um elemento (chamaremos de pivô)
Coloca todos os elementos menores que o pivô à
esquerda dele
Coloca todos os elementos maiores que o pivô à
direita dele
Repete para o sub-vetor à esquerda do pivô

e para o sub-vetor à direita do pivô
93
Intuição
19 74 12 38 2223
94
Intuição
19 74 12 38
22
23
95
Intuição
19 74 12 38
22 23
96
Intuição
19
74 12 38
22 23
97
Intuição
19 74
12 38
22 23
98
Intuição
19 7412
38
22 23
99
Intuição
19 7412 382322
100
Intuição
19 7412 382322
101
Intuição
19 74
12
382322
102
Intuição
19
74
12
382322
103
Intuição
19 7412 382322
104
Intuição
19 7412 382322
105
Intuição
19 7412 382322
106
Intuição
19 7412
38
2322
107
Intuição
19 7412
3823
22
108
Intuição
19
74
12
3823
22
109
Intuição
19 7412 2322 38
110
Intuição
19 7412 2322 38
111
Algoritmo
• O quick sort não usa memória adicional
• Ver http://algoviz.org/OpenDSA/Books/OpenDSA/
html/Quicksort.html
112
Complexidade
• Melhor caso: se o pivô for sempre a mediana (valor
que divide o vetor em duas partes iguais), a
complexidade será a mesma do merge sort:

O(n log(n))
113
Complexidade
• Melhor caso: se o pivô for sempre a mediana (valor
que divide o vetor em duas partes iguais), a
complexidade será a mesma do merge sort:

O(n log(n))
• Pior caso: se o pivô for sempre o máximo ou o
mínimo, a complexidade será a mesma dos
algoritmos incrementais:

O(n2)
113
Complexidade
• Melhor caso: se o pivô for sempre a mediana (valor
que divide o vetor em duas partes iguais), a
complexidade será a mesma do merge sort:

O(n log(n))
• Pior caso: se o pivô for sempre o máximo ou o
mínimo, a complexidade será a mesma dos
algoritmos incrementais:

O(n2)
• Caso médio: O(n log(n))
113
Confronto
114
Confronto
Na prática, na maioria das vezes o quick sort é mais
rápido do que o merge sort
115
Confronto
Na prática, na maioria das vezes o quick sort é mais
rápido do que o merge sort
Eventualmente o quick sort pode cair no pior caso
115
Discussão
116
Discussão
Para vetores muito pequenos, os algoritmos básicos
são mais rápidos do que os avançados
116
Discussão
Para vetores muito pequenos, os algoritmos básicos
são mais rápidos do que os avançados
Abordagem híbrida: usar quick sort para dividir
sucessivamente o vetor em sub-vetores. Quando o
sub-vetor for pequeno o suficiente, ordenar com
insertion sort
116
Tópicos Avançados
• Ordenação não-baseada em comparações
• Algoritmos distribuídos
• Ordenação em listas encadeadas
117
Busca e Ordenação
Sites:
https://pt.khanacademy.org/computing/computer-science/algorithms
http://algoviz.org/OpenDSA/Books/OpenDSA/html/index.html
http://www.sorting-algorithms.com/
Livros:
Estrutura de Dados, de Ascencio e Araújo
Algoritmos, de Cormen, Leiserson, Rivest e Stein
CS Unplugged, de Bell, Witten e Fellows (http://csunplugged.org/)
118

Aula: busca e ordenação