Ordenacao e Pesquisa PDF
Ordenacao e Pesquisa PDF
Ordenacao e Pesquisa PDF
Ordenao e Pesquisa
Bibliografia Bsica
l
Ordenao e Pesquisa
l
Ordenao e Pesquisa
l
l
l
l
Estrutura de Dados
l
Vetores
l
Valor
15
16
23
42
5
Pesquisa
l
Mtodos de Pesquisa
Pesquisa Sequencial
Pesquisa Binria
Pesquisa Sequencial
l
Mtodo intuitivo:
l
k=8
42
16
15
23
Chave encontrada!
Pesquisa Sequencial
Cdigo
!
! n, int k, int *posicao)!
int Sequencial(int A[], int
!
{!
!
int i;!
//sinaliza se a chave foi encontrada!
int achou = 0;!
!
!
//para cada chave!
for(i=0; i<n; i++)!
//compara com a chave de busca!
if(A[i] == k)!
!
{!
*posicao = i;! //se encontrou!
//armazena a posio!
achou = 1;!
!
}!
//indica se encontrou ou no!
! return achou;!
}!
Pesquisa Sequencial
Complexidade
int Sequencial(int A[], int n, int k, int *posicao)!
{!
int i;!
Custo Repeties
int achou = 0;!
!
!
!
for(i=0; i<n; i++)!
c1
!
!n!
if(A[i] == k)!
c2
!n-1!
{!
*posicao = i;!
achou = 1;!
}!
return achou;!
}!
Tempo = (n)
10
Pesquisa Sequencial
l
l
Exerccio
Como torn-la mais rpida?
l
2 verses.
11
Pesquisa Binria
l
12
Pesquisa Binria
l
l
k=8
4
15 16 23 42 49 51 62 70
13
Pesquisa Binria
l
l
k=8
4
15 16 23 42 49 51 62 70
14
Pesquisa Binria
l
l
k=8
4
15 16 23 42 49 51 62 70
15
Pesquisa Binria
l
l
k=8
4
15 16 23 42 49 51 62 70
Chave encontrada!
16
Melhor Caso
l
(1)
s
Pior Caso
l
18
k
k
2
.
Se
a
=
b
ento
T
(
n
)
(
n
log
O Teorema Mestre estabelece trs casos que
podem ser simplificados: 3. Se a < b k ento T (n) (n k )
19
20
Ordenao
l
l
l
23
42
16
15
16
23
42
21
Ordenao - Tipos
l
Ordenao Interna
l
Ordenao externa
l
22
Ordenao - Propriedades
l
Estabilidade
l
Adaptabilidade
l
23
Funcionamento;
Tipo de ordenao efetuada;
Complexidade
l
l
l
l
Estabilidade;
Adaptabilidade;
Especificidades;
24
Mtodos de Ordenao
l
l
l
l
l
l
l
l
Bubble Sort
(Mtodo Bolha)
l
26
Posio Chave
O vetor analisado
comparando-se pares de
1
?
chaves;
A mais leve sobe, a
2
?
mais pesada desce;
3
3
Caso j estejam na
posio correta, o
4
1
prximo par analisado.
Comparao: 1 e 3
Troca(A[4], A[3])
27
Posio Chave
1
Comparao: 1 e 2
Troca(A[3], A[2])
28
Posio Chave
O vetor analisado
comparando-se pares de
1
4
chaves;
A mais leve sobe, a
2
1
mais pesada desce;
3
2
Caso j estejam na
posio correta, o
4
3
prximo par analisado.
Comparao: 1 e 4
Troca(A[2], A[1])
29
Posio Chave
O vetor analisado
comparando-se pares de
1
1
chaves;
A mais leve sobe, a
2
4
mais pesada desce;
3
2
Caso j estejam na
posio correta, o
4
3
prximo par analisado.
A chave mais leve chegou ao topo.
No ser utilizada em futuras comparaes.
30
Posio Chave
O vetor analisado
comparando-se pares de
1
1
chaves;
A mais leve sobe, a
2
4
mais pesada desce;
3
2
Caso j estejam na
posio correta, o
4
3
prximo par analisado.
Comparao: 3 e 2
No h troca.
31
Posio Chave
O vetor analisado
comparando-se pares de
1
1
chaves;
A mais leve sobe, a
2
4
mais pesada desce;
3
2
Caso j estejam na
posio correta, o
4
3
prximo par analisado.
Comparao: 2 e 4
Troca(A[3], A[2])
32
Posio Chave
O vetor analisado
comparando-se pares de
1
1
chaves;
A mais leve sobe, a
2
2
mais pesada desce;
3
4
Caso j estejam na
posio correta, o
4
3
prximo par analisado.
A segunda mais leve chegou
sua posio.
33
Posio Chave
O vetor analisado
comparando-se pares de
1
1
chaves;
A mais leve sobe, a
2
2
mais pesada desce;
3
4
Caso j estejam na
posio correta, o
4
3
prximo par analisado.
Comparao: 3 e 4
Troca(A[4], A[3])
34
Posio Chave
O vetor analisado
comparando-se pares de
1
1
chaves;
A mais leve sobe, a
2
2
mais pesada desce;
3
3
Caso j estejam na
posio correta, o
4
4
prximo par analisado.
Chaves ordenadas.
35
// Para cada
36
!
c1
!
c2
c3
!
c4
Repeties
!n!
!n-i!
!n-i!
!n-i!
37
n n
n n
+ c3
+
= c1 n + c2
2
2
c 2 + c3 + c4 2 c1
=
n +
2
Tempo = O(n2)
38
l
l
Insertion Sort
(Mtodo de Insero)
l
Analogia com a
organizao de cartas de
baralho na mo;
Cartas so recebidas e
colocadas na mo
aleatoriamente;
Durante a organizao,
cada carta colocada no
seu lugar certo, uma por
vez, deslocando as
demais.
40
54
c1
!
c2
c3
!
!
c4
!n!
!n-1!
!n-1!
!j!
!
!
!j-1
!j-1
!n-1!
c5
c6
!!
!!
!
!
c7
55
Insertion
c c c
c c cSort
- Complexidade
= + + n + c + c + c + + + + c n (c
4
+ c3 + c 4 +
l
l
57
Selection Sort
(Mtodo de Seleo)
l
l
Princpio simples;
A cada iterao procura a chave de menor valor ainda
no ordenada;
Depois de encontrada, ela inserida na posio correta
do vetor.
58
Menor chave ?
Posio
59
Menor chave 6
Posio
60
Menor chave 4
Posio
61
Menor chave 3
Posio
62
Menor chave 3
Posio
63
Menor chave 1
Posio
64
Menor chave 1
Posio
65
Menor chave 3
Acelerando
Posio
66
Menor chave 3
Posio
67
Menor chave ?
Posio
68
Menor chave 4
Acelerando
Posio
69
Menor chave 4
Posio
70
Menor chave ?
Posio
71
Menor chave 5
Acelerando
Posio
72
Menor chave 5
Posio
73
Chaves ordenadas.
74
!
!
Troca(&A[i], &A[indice]);!
}!
//Procura a menor!
!
//atualiza as variveis!
!
!
!
//Troca de lugar com a primeira!
//chave no ordenada!
75
Troca(&A[i], &A[indice]);!
}!
c1 !
!
c2 !
c3 !
!
c4 !
!
c5 !
!
c6 !
c7 !
!
!
!
c8 !
!
Repeties
!
!n!
!
!
!n-1!
!n-1!
!n-i!
!n-i
!!
!
!
!n-i
!n-i!
!!
!n-1!
76
c c c c
c4 c5 c6 c7 2
+ + + n + c1 + c2 + c3 + 4 + 5 + 6 + 7 + c8 n (c2 + c3 +
2 2 2 2
2 2 2 2
Tempo = O(n2)
77
78
Quicksort
l
l
l
l
Procedimento recursivo;
Complexidade varia com o caso;
Funcionamento no trivial como os anteriores.
79
Quicksort
l
Quicksort - Funcionamento
l
Piv
81
Quicksort - Funcionamento
l
Piv
Diviso
82
Quicksort - Funcionamento
l
Piv
Diviso
Quicksort - Funcionamento
l
Piv
Diviso
84
Quicksort - Funcionamento
l
Piv
Diviso
85
Quicksort - Funcionamento
l
Piv
Diviso
86
Quicksort - Funcionamento
l
Piv
Diviso
87
Quicksort - Funcionamento
l
Piv
Diviso
88
Quicksort - Funcionamento
l
Piv
Diviso
89
Quicksort - Funcionamento
l
Piv
Diviso
90
Quicksort - Funcionamento
l
l
91
Quicksort - Funcionamento
l
l
Piv
92
Quicksort - Funcionamento
3
93
Quicksort - Cdigo
int Particao(int A[], int esquerda, int direita) !
!
{!
!
int i;!
!
int j;!
!
!
//varivel de controle!
i = esquerda;!
//percorre o subvetor!
for(j=esquerda+1; j<=direita; j++) !
!
{!
//se a chave analisada!
if (A[j] < A[esquerda]) !
//for menor que o piv!
! {!
!
i++;!
//troca as chaves de !
Troca(&A[i], &A[j]);!
//posio!
}!
!
}!
!
!
//insere o piv na !
Troca(&A[esquerda], &A[i]);!
//posio correta!
!
return i;!
}!
!
94
Quicksort - Cdigo
95
Quicksort - Complexidade
int Particao(int A[], int esquerda, int direita) !
{!
int i;!
int j;!
!
i = esquerda;!
1 for(j=esquerda+1; j<=direita; j++) !
{!
2
if (A[j] < A[esquerda]) !
! {!
3
i++;!
4
Troca(&A[i], &A[j]);!
}!
}!
!
Troca(&A[esquerda], &A[i]);!
!
return i;!
}!
!
!
Custo
!
c1 !
!
c2 !
!
c3 !
c4 !
Repeties
!
!n!
!n-1!
!
!
!n-1!
!n-1!
Tempo = (n)
96
Quicksort - Complexidade
l
l
l
Quicksort - Complexidade
l
ou
-1 (partio
n
T (n) T + T n 1 + (n)
2
2
n
T (n) 2T + (n)
2
T (n) = O(n log n)
Quicksort - Complexidade
l
99
Quicksort - Complexidade
l
A pior partio
A melhor partio
100
Quicksort - Complexidade
l
[(n-1)/2]-1
(n)+(n-1) = (n)
l
Quicksort - Complexidade
l
102
Quicksort Resumo
l
l
l
l
Heapsort
l
l
l
104
Heapsort - Heaps
16
2
14
10
10
10
16 14 10 8
105
Heaps
l
Heapsort Funcionamento
l
107
Heapsort MAX-HEAPIFY
l
108
Heapsort MAX-HEAPIFY
4
14
8
10
109
Heapsort
14
MAX-HEAPIFY
4
5
4
10
10
6
9
110
Heapsort
14
MAX-HEAPIFY
4
5
8
10
10
6
9
111
MAX-HEAPIFY - Cdigo
void MAX_HEAPIFY(int A[], int i, int n){! !!
int esquerdo;!
//determina o filho esquerdo!
int direito;!
//determina o filho direito!
!
int maior;!
!
!
!
!
if(esquerdo <= n && A[esquerdo] > A[i])!//se o filho esquerdo for!
//maior que o pai, registra!
!
maior = esquerdo;!
!
else!
//seno!
!
maior = i;!
//o maior o pai mesmo!
//se o direito maior que o maior!
if (direito <= n && A[direito] > A
!
[maior])!
//registra!
!
maior = direito;!
!
if(maior != i)
{!
//se o maior no o pai!
Troca(&A[i], &A[maior]);!
!
//troca as posies!
!
MAX_HEAPIFY(A, maior, n);!
//verifica se a subrvore viola a !
}!
//propriedade!
esquerdo = 2*i;!
direito = 2*i+1;!
}!
!
!
!
112
MAX-HEAPIFY - Complexidade
l
l
l
T(
=T
113
Heapsort BUILD-MAX-HEAP
l
l
l
114
1
4
Heapsort BUILD-MAX-HEAP
2
16
10
14
16
10
14
7
115
Heapsort BUILD-MAX-HEAP
4
2
16
10
14
116
Heapsort BUILD-MAX-HEAP
4
2
14
16
10
117
Heapsort BUILD-MAX-HEAP
4
2
10
14
16
10
118
Heapsort BUILD-MAX-HEAP
4
2
16
10
14
10
119
Heapsort BUILD-MAX-HEAP
16
2
14
10
10
120
BUILD-MAX-HEAP - Cdigo
121
BUILD-MAX-HEAP
Complexidade
l
l
122
Heapsort - Funcionamento
l
l
l
l
16
Heapsort - Funcionamento
10
14
8
2
7
4
124
14
Heapsort - Funcionamento
10
8
4
16
125
10
Heapsort - Funcionamento
9
8
4
2
7
14
16
126
Heapsort - Funcionamento
3
8
4
i
10
7
14
16
127
Heapsort - Funcionamento
7
4
10
2
14
16
128
Heapsort - Funcionamento
3
4
i
1
10
2
14
16
129
Heapsort - Funcionamento
3
2
i
1
10
7
14
16
130
Heapsort - Funcionamento
1
2
4
10
7
14
16
131
Heapsort - Funcionamento
1
4
10
7
14
16
132
Heapsort - Funcionamento
4
14
10
16
10
14
16
133
Heapsort - Cdigo
void HEAPSORT(int A[], int n)!
{!
int i;!
!
BUILD_MAX_HEAP(A, n-1);!
!
for(i=n-1; i>0; i--)!
{!
Troca(&A[1], &A[i]);!
!
MAX_HEAPIFY(A, 1, i-1);!
}!
}!
!
!
!
!
//constri o heap inicial!
!
//para cada chave!
//coloca a raiz do heap na !
//posio correta da ordenao!
//verifica e corrige a!
//propriedade do heap!
134
Heapsort - Complexidade
void HEAPSORT(int A[], int n)!
{!
int i;!
!
BUILD_MAX_HEAP(A, n-1);!
!
for(i=n-1; i>0; i--)!
{!
Troca(&A[1], &A[i]);!
!
MAX_HEAPIFY(A, 1, i-1);!
}!
}!
Custo
O(n)
!
c1!
!
c3!
O(logn)
Repeties
!
!1!
!n!
!
!
!n-1!
!n-1!
!
!
!
!
!
135
Heapsort - Complexidade
Tempo = O(nlogn)
136
Heapsort Resumo
l
l
l
l
l
l
137
l
l
138
n A[i]
139
/
A
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
140
7
8
/
A
0,78
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
141
/
0,17
1
2
7
8
/
A
0,78
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
142
1
2
0,17
0,39
3
4
7
8
/
A
0,78
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
143
0,17
0,26
0,39
7
8
/
A
0,78
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
144
0,17
0,26
0,39
0,72
/
A
0,78
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
145
0,17
0,26
0,39
7
8
0,72
0,78
9
A
0,94
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
146
0,17
0,21
0,39
7
8
/
0,26
0,78
0,72
9
A
0,94
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
147
0,12
0,17
0,21
0,26
0,39
0,78
7
8
0,72
9
A
0,94
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
148
0,12
0,17
0,23
0,21
0,39
7
8
/
0,26
0,72
0,78
9
A
0,94
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
149
0,12
0,17
0,23
0,21
0,39
0,68
0,72
0,78
/
0,26
9
A
0,94
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
150
0,12
0,17
0,23
0,21
0,39
0,68
0,72
0,78
/
0,26
Balde desordenado.
9
A
0,94
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
151
0,12
0,17
0,21
0,23
0,39
0,68
0,72
0,78
/
0,26
9
A
0,94
0,78
0,17
0,39
0,26
0,72
0,94
0,21
0,12
0,23
0,68
152
153
!
!
!
!
Repeties
!n!
!n-1!
!n-1!
!n-1!
154
E[T (n)] = E (
n 1
= (n) + E[O
0
n 1
= ( n ) + O ( E
1550
l
l
156
l
l
Radix Sort
l
l
l
l
158
Radix Sort
l
159
2
5
5
3
3
2
5
9
7
7
9
6
0
5
160
2
5
5
3
3
2
5
9
7
7
9
6
0
5
7
3
4
4
6
3
8
2
5
3
5
5
2
3
0
5
6
7
7
9
9
161
2
5
5
3
3
2
5
9
7
7
9
6
0
5
7
3
4
4
6
3
8
2
5
3
5
5
2
3
0
5
6
7
7
9
9
162
2
5
5
3
3
2
5
9
7
7
9
6
0
5
7
3
4
4
6
3
8
2
5
3
5
5
2
3
0
5
6
7
7
9
9
7
3
4
8
3
4
6
2
2
3
3
5
5
5
0
9
6
9
5
7
7
163
2
5
5
3
3
2
5
9
7
7
9
6
0
5
7
3
4
4
6
3
8
2
5
3
5
5
2
3
0
5
6
7
7
9
9
7
3
4
8
3
4
6
2
2
3
3
5
5
5
0
9
6
9
5
7
7
164
2
5
5
3
3
2
5
9
7
7
9
6
0
5
7
3
4
4
6
3
8
2
5
3
5
5
2
3
0
5
6
7
7
9
9
7
3
4
8
3
4
6
2
2
3
3
5
5
5
0
9
6
9
5
7
7
3
3
4
4
6
7
8
2
5
3
5
5
2
3
9
5
6
7
7
0
9
165
167
Merge Sort
(Ordenao por Intercalao)
l
l
l
um algoritmo recursivo.
169
Merge Sort
l
170
p
l
l
l
(
171
2
p
q Sentinela
q+1
172
r Sentinela
173
174
175
176
177
178
179
180
181
MERGE - Cdigo
MERGE(int A[], int p, int q, int r)!
{!
n1 = q-p+1;!
n2 = r-q;!
!
for(i=0; i<n1; i++)!
E[i] = A[p+i];!
for(i=0; i<n2; i++)!
!
D[i] = A[q+i+1];!
!
E[n1] = INT_MAX;!
D[n2] = INT_MAX;!
i = j = 0;!
!
for(k=p; k<=r; k++)!
if(E[i] <= D[j])
! {!
!
! A[k] = E[i]; i++;!
! }!
! else
! {!
!
A[k] = D[j]; j++;!
! }!
}!
MERGE - Complexidade
MERGE(int A[], int p, int q, int r)!
{!
n1 = q-p+1;!
n2 = r-q;!
!
for(i=0; i<n1; i++)!
E[i] = A[p+i];!
for(i=0; i<n2; i++)!
!
D[i] = A[q+i+1];!
!
E[n1] = INT_MAX;!
D[n2] = INT_MAX;!
i = j = 0;!
!
for(k=p; k<=r; k++)!
if(E[i] <= D[j])
! {!
!
! A[k] = E[i]; i++;!
! }!
! else
! {!
!
A[k] = D[j]; j++;!
! }!
}!
!
Custo
!
!
c1 !
!
c2 !
!
!
!
!
!
!
c3 !
!
Repeties
!
!(n/2)+1!
!(n/2)+1!
!n!
!
!
Tempo = (n)
183
184
MERGE_SORT
185
MERGE_SORT
186
MERGE_SORT
5
187
MERGE_SORT
5
Intercala
188
MERGE_SORT
52
25
189
MERGE_SORT
52
25
Intercala
190
MERGE_SORT
52
25
191
MERGE_SORT
52
25
Intercala
192
MERGE_SORT
52
25
193
MERGE_SORT
52
25
194
MERGE_SORT
52
25
Intercala
195
MERGE_SORT
52
25
Intercala
196
MERGE_SORT
52
25
Intercala
197
MERGE_SORT
Intercala
52
25
198
MERGE_SORT
52
25
199
MERGE_SORT - Cdigo
!
//dividir!
//conquistar!
!
//combinar!
!
l
(1)
se
T (n) =
/ 2) + D(n) + C (n) nos out
2T (nrecursivo,
Em se tratando de um algoritmo
a
complexidade definida por uma recorrncia:
l
Dividir D(n);
Conquistar;
Combinar C(n).
201
T ( n) =
T ( n) =
203
l
l
204