Next: About this document ...
MAC-IME-USP CARLOS EDUARDO FERREIRA
SALA 297A TEL.: 3818 6140
E-MAIL cef@ime.usp.br
MONITOR: MARCIO C. CABRAL
MAC 122 - Princípios de Desenvolvimento de Algoritmos
Segundo semestre de 2000
Lista de exercícios--Ordenação
- Ordene a seqüência abaixo abaixo usando os métodos Mergesort, Quicksort, Heapsort e Bubblesort:
12 23 5 9 0 4 1 12 21 2 5 14
Em cada um dos casos, qual o número de comparações e de trocas feitas durante a ordenação?
- Queremos ordenar um vetor de
elementos cada uma de cujas componentes
é 'A' ou 'B'. Escreva um algoritmo que faça no máximo n-1
comparações para ordenar o vetor. (Use um vetor auxiliar se
necessário). Se soubermos que o vetor tem apenas dois elementos diferentes
(mas não sabemos quais são elas), sua função ainda funciona?
- Encontre permutações do vetor 1,2,3,4,5 que forcem:
- o algoritmo Quicksort a executar o número máximo de
comparações;
- o algoritmo Quicksort a executar o número máximo de trocas;
- o algoritmo Shakersort a executar o número máximo de
comparações;
- o algoritmo Bubblesort a executar o número
máximo de trocas.
- Faça uma função Merge que recebe vetores ordenados
e
e devolve um vetor ordenado
que resulta da
intercalação de
e
. Faça duas versões do algoritmo: uma
iterativa e uma recursiva. Encontre instâncias (dados) em que o
algoritmo acima faz:
comparações;
comparações;
comparações.
- Considere o seguinte trecho de programa:
for (i = 0; i <n; i++) cont[i] = 0;
for (i=0; i< n; i++)
for (j = 0; j < n; j++)
if (V[j] < V[i]) cont[i]++;
- Escreva um algoritmo que ordene um vetor
utilizando o trecho
acima. Observe o que ocorre se
tiver elementos repetidos.
- Quantas comparações e quantas movimentações envolvendo os
elementos do vetor
são feitas no melhor caso? Quantas no pior caso?
Quantas no caso médio?
- Considere o seguinte algoritmo para ordenação de um vetor
:
W = V;
enquanto
não está ordenado faça início
W := uma permutação de V que ainda não foi
testada
fim;
- Quantas comparações são necessárias para verificar se um
vetor está ordenado?
- Quantas permutações deverão ser
testadas no pior caso? E no caso médio?
- Baseado nas respostas
aos itens acima, calcule quantas comparações esse algoritmo faz,
no pior caso, para ordenar um vetor de n elementos. Repita para o melhor
caso. Repita para o caso médio.
- Em cada uma das situações abaixo, qual algoritmo de
ordenação mais apropriado?
- Um vetor de inteiros de tamanho menor ou igual a 8.
- Uma lista de nomes parcialmente ordenada.
- Uma lista de nomes em ordem aleatória.
- Uma lista de inteiros positivos menores que 100.
- Um arquivo que não cabe na memória principal.
- Considere as seguintes funções de ordenação de um vetor
:
void ordena (vetor A, int n)
{
int i, j, min;
for(i = 0; i < n - 1; i++){ /* I */
min = i;
for (j = i+1; i < n; i++)
if (A[j] < A[min]) /* II */
min = j;
troca (A, i, min); /* III */
}
}
void class (vetor A, int n)
{
int i, j;
for (i = 1; i < n; i++) /* I */
for (j = i; j > 1; j--)
if (A[j] < A[j-1]) /* II */
troca (A, j, j-1); /* III */
}
Para cada um dos algoritmos responda às seguintes perguntas.
- Para cada um dos algoritmos, qual a situação do vetor A a
cada passagem pelo ponto I? Justifique.
- Baseado em sua resposta em a, mostre que cada uma das funções
de fato ordena o vetor A.
- Qual o número máximo e mínimo de vezes que a
comparação II é executada e em que situações ocorre?
- Idem para o comando III, que troca elementos.
- Faça uma função recursiva que ordena um vetor
de
elementos baseado no seguinte algoritmo: Obtenha um número
em
. Divida o vetor em duas partes, a primeira com
elementos e
a segunda com
. Ordene cada uma das duas partes. Depois, supondo
que
e
, intercale as duas seqüências de forma a completar a
ordenação de
. Use vetores auxiliares se necessário.
- Considere o algoritmo do exercício anterior com
,
depois com
, depois com
.
Você já viu antes o algoritmo correspondente a algum destes valores
de p? Qual das três escolhas sugeridas para
é a mais eficiente?
Por quê?
Next: About this document ...
Carlos Eduardo Ferreira
2000-10-31