[Prévia cron] [Próxima Cron] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
[Índice de autor]
Lista de exercícios para a turma do básico.
- Subject: Lista de exercícios para a turma do básico.
- From: Imre Simon <is@ime.usp.br>
- Date: Thu, 19 Oct 2000 15:39:06 -0300
Estes exercícios não precisam ser entregues, porém a sua resolução
deverá tornar a prova da semana que vem mais amena.
Bom trabalho,
Imre Simon
=====
Exercício 6.1
[1 ponto] Escreva uma versão recursiva do algoritmo de ordenação por seleção.
Exercício 6.2
[1 ponto] Escreva uma versão recursiva do algoritmo de ordenação por inserção.
Exercício A.2
[Sedg 6.14, p.262] [2 pontos] O algoritmo de ordenação por seleção é
estável? Justifique.
Um algoritmo de ordenação é estável se não muda a ordem relativa dos
itens que têm uma mesma chave. Por exemplo, se o algoritmo transforma
um vetor como
88-preto 99 88-verm 88-azul 77
(estou usando cores para distinguir chaves iguais) em
77 88-verm 88-preto 88-azul 99
então o algoritmo não é estável. Veja Sedgewick, p.259.
Exercício A.3
[Sedg 6.18, p.265] [2 pontos] O algoritmo de ordenação por inserção é
estável? Justifique.
Exercício 9.3
[2 pontos] [Sedg 9.28, p.383] Mostre que o heapsort não é estável.
Exercício B.1
[4 pontos] Implemente e teste um programa que ordene cadeias de
caracteres (uma lista de nomes, por exemplo). Use o algoritmo de
seleção ou inserção. Inspire-se nos programas
6.11 e 3.17 do Sedgewick (e também nas idéias sugeridas pelos
programas 6.6 a 6.10).
A série 7 de exercícios referem-se ao algoritmo de partição. Mais
exercícios e até mesmo material teórico basedo no livro texto
encontra-se na página:
http://www.ime.usp.br/~pf/mac122/aulas/quick.htm
Exercício 7.1
[1 ponto] Discuta e critique a seguinte variante do algoritmo da partição:
int partition (int a[], int l, int r) {
int b[1000], v = a[r], i = l, j = r, k;
for (k = l; k < r; ++k)
if (a[k] <= v) b[i++] = a[k];
else b[j--] = a[k];
// agora i == j
b[i] = v;
for (k = l; k <= r; ++k) a[k] = b[k];
return i;
}
Exercício 7.2
[1 ponto] Discuta e critique a seguinte variante do algoritmo da partição:
#define troca(X, Y) { int t = X; X = Y; Y = t; }
int partition (int a[], int l, int r) {
int v = a[r], i = l, j = r-1;
while (i <= j) {
if (a[i] < v) ++i;
else {
troca (a[i], a[j]);
--j;
}
}
troca (a[j], a[r]);
return j;
}
Exercício 7.3
[1 ponto] Discuta e critique a seguinte variante do algoritmo da partição:
#define troca(X, Y) { int t = X; X = Y; Y = t; }
int partition (int a[], int l, int r) {
int v = a[r], i = l, j = r-1;
while (i <= j) {
if (a[j] >= v) {
a[j+1] = a[j];
--j;
}
else {
troca (a[i], a[j]);
++i;
}
}
a[i] = v;
return i;
}
Exercício 7.4
[1 ponto] Discuta e critique a seguinte variante do algoritmo da partição:
#define troca(X, Y) { int t = X; X = Y; Y = t; }
int partition (int a[], int l, int r) {
int v = a[r], i = l, j = r-1;
while (1) {
while (a[i] < v) ++i;
while (j >= l && v <= a[j]) --j;
if (i >= j) break;
troca (a[i], a[j]);
++i; --j;
}
troca (a[i], a[r]);
return i;
}
Exercício 10.4
Mostre, passo a passo, como o quicksort ordena o vetor "EASYQUESTION".
Exercício 10.5
Mostre, passo a passo, como o heapsort ordena o vetor "EASYQUESTION".
Exercício D.1
[4 pontos] Escreva uma função recursiva com protótipo
void mergesort(int a[], int l, int r);
que rearrange o vetor a[l..r-1] em ordem decrescente.
O código da rotina de intercalação (merge) deve estar embutido na
função mergesort. Essa rotina de intercalação deve começar com
a[l..m-1] e a[m..r-1] decrescentes e terminar com a[l..r-1]
decrescente.
Sua função pode usar um vetor auxiliar (alocado
dinâmicamente). Inspire-se no programa 8.2 do Sedgewick.