Escolar Documentos
Profissional Documentos
Cultura Documentos
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
25 / 162
Vetores
Busca
Problema da busca
Dado x e vetor v[0 . . n1], encontrar um ndice k tal que v[k] = x.
987
0
n1
222 555 111 333 444 666 555 888 777 987 654
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
26 / 162
Vetores
Busca
Problema da busca
Dado x e vetor v[0 . . n1], encontrar um ndice k tal que v[k] = x.
987
0
n1
222 555 111 333 444 666 555 888 777 987 654
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
26 / 162
Vetores
Busca
Algoritmo de busca
Recebe um nmero x e um vetor v[0 . . n1] com n 0
e devolve k no intervalo 0 . . n1 tal que v[k] = x.
Se tal k no existe, devolve 1.
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
27 / 162
Vetores
Busca
int k;
if (n == 0) return -1;
k = n - 1;
while (k >= 0 && v[k] != x) k -= 1;
return k;
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
28 / 162
Vetores
Busca
int k;
if (n == 0) return -1;
k = n - 1;
while (k >= 0 && v[k] != x) k -= 1;
return k;
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
28 / 162
Vetores
Busca
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
29 / 162
Vetores
Busca
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
30 / 162
Vetores
Busca
Deselegante!
int feio (int x, int v[], int n) {
if (n == 1) {
if (x == v[0]) return 0;
else return -1;
}
if (x == v[n-1]) return n - 1;
return feio (x, v, n - 1);
}
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
31 / 162
Vetores
Remoo
Problema de remoo
Remover o elemento de ndice k de um vetor v[0 . . n1].
Decises de projeto:
suporemos 0 k n 1
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
32 / 162
Vetores
Remoo
Problema de remoo
Remover o elemento de ndice k de um vetor v[0 . . n1].
Decises de projeto:
suporemos 0 k n 1
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
32 / 162
Vetores
Remoo
Algoritmo de remoo
Remove o elemento de ndice k do vetor v[0 . . n1]
e devolve o novo valor de n. Supe 0 k < n.
exemplo de uso:
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
33 / 162
Vetores
Remoo
Algoritmo de remoo
Remove o elemento de ndice k do vetor v[0 . . n1]
e devolve o novo valor de n. Supe 0 k < n.
exemplo de uso:
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
33 / 162
Vetores
Remoo
Verso recursiva
int RemoveR (int k, int v[], int n) {
if (k == n-1) return n - 1;
else {
v[k] = v[k+1];
return RemoveR (k + 1, v, n);
}
}
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
34 / 162
Vetores
Insero
Problema de insero
Inserir um novo elemento y entre as posies k 1 e k
de um vetor v[0 . . n1].
Decises de projeto:
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
35 / 162
Vetores
Insero
Problema de insero
Inserir um novo elemento y entre as posies k 1 e k
de um vetor v[0 . . n1].
Decises de projeto:
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
35 / 162
Vetores
Insero
Algoritmo de insero
Insere y entre as posies k 1 e k do vetor v[0 . . n1]
e devolve o novo valor de n. Supe que 0 k n.
exemplo de uso:
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
36 / 162
Vetores
Insero
Algoritmo de insero
Insere y entre as posies k 1 e k do vetor v[0 . . n1]
e devolve o novo valor de n. Supe que 0 k n.
exemplo de uso:
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
36 / 162
Vetores
Insero
Verso recursiva
int InsereR (int k, int y, int v[], int n) {
if (k == n) v[n] = y;
else {
v[n] = v[n-1];
InsereR (k, y, v, n - 1);
}
return n + 1;
}
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
37 / 162
Vetores
Problema de busca-e-remoo
Remover todos os elementos nulos de um vetor v[0 . . n1].
Algoritmo
Remove todos os elementos nulos de v[0 . . n1],
deixa o resultado em v[0 . . i1], e devolve o valor de i.
int RemoveZeros (int v[], int n) {
int i = 0, j;
for (j = 0; j < n; j++)
if (v[j] != 0) {
v[i] = v[j];
i += 1;
}
return i;
}
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
38 / 162
Vetores
Problema de busca-e-remoo
Remover todos os elementos nulos de um vetor v[0 . . n1].
Algoritmo
Remove todos os elementos nulos de v[0 . . n1],
deixa o resultado em v[0 . . i1], e devolve o valor de i.
int RemoveZeros (int v[], int n) {
int i = 0, j;
for (j = 0; j < n; j++)
if (v[j] != 0) {
v[i] = v[j];
i += 1;
}
return i;
}
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
38 / 162
Vetores
quando n vale 0
Invariantes
No incio de cada iterao
ij
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
39 / 162
Vetores
quando n vale 0
Invariantes
No incio de cada iterao
ij
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
39 / 162
Vetores
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
40 / 162
Vetores
Verso recursiva
int RemoveZerosR (int v[], int n) {
int m;
if (n == 0) return 0;
m = RemoveZerosR (v, n - 1);
if (v[n-1] == 0) return m;
v[m] = v[n-1];
return m + 1;
}
P. Feofiloff (IME-USP)
Algoritmos em C
Campus/Elsevier
41 / 162