1. INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE MINAS GERAIS
CAMPUS SÃO JOÃO EVANGELISTA
Exercícios de
Algoritmos e Estrutura de Dados
Assunto: Lista de Exercícios 6
Componentes: Wárlley Júnio Andrade
Curso: Superior em Sistemas de Informação
Série/Turma: BSI111A
Professor: Bruno Toledo
São João Evangelista, Maio de 2012.
2. INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE MINAS GERAIS
CAMPUS SÃO JOÃO EVANGELISTA
1. Qual a ideia central do Quicksort?
O Quicksort utiliza o conceito de divisão e conquista, ou seja, dividir o problema grande em
subproblemas para a resolução, para isso ele utiliza a recursividade para que ele possa dividir o
problema.
1 primeira parte do algoritmo seria encontra o pivô, o pivô nada mais é que a soma dos índices
externos do vetor divididos por 2 , ou seja é o índice médio do vetor.
2 A principio o algoritmo separa os elementos maiores que o pivô para a direita e os elementos
menores que o pivô para a esquerda pois vai ser com o pivô que ele vai comparar cada elemento
para colocá-lo na ordem certa.
2. Descreva a utilidade da Partição do método Quicksort?
A partição tem a função de rearranjar o vetor por meio da escolha de um pivô, de tal forma que
ao final o vetor estará particionado com uma parte esquerda com todos os elementos anteriores ao
pivô menores que ele, e outra parte onde todos os elementos posteriores ao pivô sejam maiores
que ele.
3. Qual(ais) a(s) diferença(s) entre o pior caso e o melhor caso do método Quicksort?
Pior caso: C(n) = O (n2)
O pior caso ocorre quando, sistematicamente, o pivô é escolhido como sendo um dos
extremos de um arquivo já ordenado.
Isto faz com que o procedimento Ordena seja chamado recursivamente n vezes,
eliminando apenas um item em cada chamada.
Melhor caso:
C(n) = 2C(n/2) + n = n log n
Esta situação ocorre quando cada partição divide o arquivo em duas partes iguais.
4. Quais as vantagens do Quicksort?
É extremamente eficiente para ordenar arquivos de dados.
Necessita de apenas uma pequena pilha como memória auxiliar.
Requer cerca de n log n comparações em média para ordenar n itens.
5. Quais as desvantagens do Quicksort?
Tem um pior caso O(n2) comparações.
Sua implementação é muito delicada e difícil:
Um pequeno engano pode levar a efeitos inesperados para algumas entradas de dados.
O método não é estável.
6. Explique o funcionamento do algoritmo abaixo:
Int partição (int x[], int p, int r)
{
Int pivo, I,j; // declaração das variáveis locais
3. INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE MINAS GERAIS
CAMPUS SÃO JOÃO EVANGELISTA
Pivo =x[(p+r)/2]; // aqui é realizado o calculo para achar o pivô
I = p – 1; // i percorre da esquerda para direita
J = r +1; // j percorre da direita para esquerda
While(i < j) // repetição enquanto o extremo i for menor que o j
{
Do
{
J = j – 1; // o índice que aponta para valor que vai ser comparado e percorrido da direita para a
esquerda ate chegar no pivô para realizar a ordenação
}
While (x[j] > pivô); // enquanto o vetor j for maior que o pivô, o vetor é percorrido
Do
{
I = I +1; // o índice que aponta para o valor que vai ser percorrido da esquerda para a direita ate
chegar no pivô para realizar a ordenação
}
While (x[i] < pivo); enquanto o vetor i for menor que o pivô, vai percorrendo o vetor
If (I < j)
Troca (x, I, j); // aqui é realizada a troca de valores na função troca
}
Return j;
}
7. Utilizando o método de ordenação Quicksort onde o pivô será o valor central, ordene o
vetor com os valores: 3, 8, 9, 15, 12, 10, 1, 17, 20, 25.
0 1 2 3 4 5 6 7 8 9
3 8 9 15 12 10 1 17 20 25
Primeira partição:
0 1 2 3 4 5 6 7 8 9
3 8 9 1 10 12 15 17 20 25
Segunda partição:
0 1 2 3 4
3 8 1 9 10
Terceira partição:
0 1 2
3 1 8
Quarta partição:
0 1 2
1 3 8
4. INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE MINAS GERAIS
CAMPUS SÃO JOÃO EVANGELISTA
0 1 2 3 4 5 6 7 8 9
1 3 8 9 10 12 15 17 20 25
Quinta partição:
5 6 7 8 9
12 15 17 20 25
Caso especial: Pivô já está na posição correta
Final:
0 1 2 3 4 5 6 7 8 9
1 3 8 9 10 12 15 17 20 25
8. Utilizando o algoritmo em C do Quicksort, cujo pivô é o valor central do vetor, faça um
código onde peça o usuário para digitar 5 valores de um vetor e retorne a ordenação de
forma decrescente
#include <stdio.h>
#include <stdlib.h>
int quick(int v[],int ini, int fim)
{
int i,f,pivo,aux;
i=ini;
f=fim;
pivo=v[(ini+fim)/2];
while(i<f)
{
while (v[i]> pivo) //v[i]<pivo separa os elementos < pivo para a esquerda
{
i++;
}
while (v[f]< pivo) //v[i]>pivo separa os elementos > pivo para a esquerda
{
f--;
}
if (i<=f)
{
aux = v[i];
v[i] = v[f];
v[f] = aux;
i++;
f--;
}
}
if (f > ini)
5. INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DE MINAS GERAIS
CAMPUS SÃO JOÃO EVANGELISTA
{
quick(v,ini,f);
}
if (i < fim)
{
quick (v,i,fim);
}
}
int main()
{
int vetor[5];
int i;
printf(" -------- entre com o vetor desordenado: ---------nn");
for(i = 0; i<5; i++)
{
printf("valor da posicao %d: ",i);
scanf("%d",&vetor[i]);
}
printf("n");
printf("vetor original:");
for(i = 0;i<5;i++)
printf(" %d",vetor[i]);
printf("nn");
quick(vetor,0,4);
printf("vetor ordenado:");
for(i=0;i<5;i++)
printf(" %d", vetor[i]);
printf("nn");
system("pause");
}