Vous êtes sur la page 1sur 6

Trabalho 2

Algoritmo e Estrutura de Dados II


Relatório
Renato Oliveira
200810230

Introdução:
Nesse trabalho foram realizados testes com os seguintes algoritmos
de ordenação: Seleção, Inserção, Bolha, Rápida, Fusão e Concha. Foram
analisados seus desempenhos nos testes e comparados com sua
complexidade oficial. Os resultados foram colocados em gráficos para fácil
visualização.

Funcionamento do Algoritmo Concha:


O algoritmo concha (Shell Sort ) funciona similar ao bolha, só que ao
invés de se comparar um termo com seu seguinte, ele compara um termo
com um outro a uma distância D a frente, essa distancia D inicia em N/2,
onde N é o numero de posições do vetor a ser ordenado. Ele percorre o
vetor com distancia D diversas vezes, até não realizar mais trocas, então
divide-se a distancia por 2, se faz isso até a distância ser 1, quando
terminado as comparações com distancia 1( que é igual ao bolha), o vetor
estará ordenado.

Algoritmo Concha:
Procedimento Concha( vetor:arranjo [0..N - 1] de inteiros )
Variáveis
Auxiliar:inteiro;
a:inteiro;
b:inteiro;
c:inteiro;
d:inteiro;
inicio
d := N / 2;
Faça
Inicio
A := 0;
Se ( d > 1 ) e ( c = 0 ) faça
Inicio
D := d / 2;
Fim se;
B := d;
C := 0;
Enquanto ( b < N ) faça
Inicio
Se (vetor[a] > vetor[b] ) faça
Inicio
Auxiliar := vetor[a];
Vetor[a] := vetor[b];
Vetor[b] := auxiliar;
C := 1;
Fim se;
A := a + 1;
B := b + 1;
Fim enquanto;
Fim faça Enquanto ( c = 1 ) ou ( d > 1 );
Fim;

Complexidade dos Algoritmos:

Seleção ( N^2 ) / 2
Inserção ( N^2 ) / 4
Bolha N^2
Fusão n (lg n)
Rápida n (lg n)
Concha N ^(3/2)
Complexidade com Busca Binária:
Seleção (N^2 + 2lgN ) / 2
Inserção (N^2 + 4lgN) / 4
Bolha N^2 + lgN
Fusão (N + 1) lgN
Rápida (N + 1) lgN
Concha N^(3/2) + lgN
A aplicação da busca binária mais um algoritmo de ordenação tem
uma complexidade maior do que se aplicarmos a busca seqüencial apenas.
Se for necessário realizar apenas uma busca, é mais vantajoso utilizar a
busca seqüencial em vetores não ordenados. Para que a utilização da busca
binária junto com um algoritmo de ordenação seja mais vantajosa, deve se
utilizar o quick ou merge sort, e tem que se necessitar de no mínimo N
buscas, tal que N * X > X lgX + NlgX ou seja NX > ( X + N ) lgX, onde X
é o numero de posições do vetor.

Analise Individual dos Algoritmos:

1 – Seleção
No algoritmo de ordenação por Seleção podemos observar que os
resultados dos testes são quase idênticos às previsões oficiais de sua
complexidade, a diferença é tão ínfima que nem aparece no gráfico.
Como podemos observar na curva parabólica o algoritmo Select Sort
tem comportamento exponencial. A sua implementação invertida tem
exatamente o mesmo resultado de desempenho nos testes.

2 – Inserção

Como podemos observar no gráfico novamente os resultados dos


testes são bem próximos às previsões de sua complexidade, mas no caso do
Insert Sort isso oscila mais, pois esse é um algoritmo que varia muito o
desempenho de acordo com as condições do vetor, onde seu pior caso é um
vetor invertido e o melhor é um vetor ordenado, varia a complexidade de
n^2 / 2 no pior caso e n no melhor, na media n^2 / 4.
Curva parabólica, comportamento exponencial. A sua
implementação invertida apresenta uma variação muito ínfima, que não
seria visível no gráfico.

3 – Bolha

Como podemos ver no gráfico, o algoritmo de ordenação Bolha


mostrou nos testes valores bem próximos às previsões de sua
complexidade, quase que não visível no gráfico essa diferença. O bolha
também varia bastante seu desempenho de acordo com o estado do vetor.
A versão invertida do Bubble Sort tem uma variação maior que os
dois algoritmos anteriores, mas mesmo assim ainda continua imperceptível
no gráfico, devido a magnitude dos valores envolvidos.
A curva parabólica mostra que esse algoritmo tem comportamento
exponencial, N^2.

4 – Fusão
O algoritmo de ordenação por Fusão diferencia o desempenho
consideravelmente quando compara-se os resultados dos teste com as
previsões oficiais de seu desempenho, isso ocorre pois seu desempenho
oficial não leva em conta o numero de interações necessárias para se copiar
os valores do vetor auxiliar para o vetor principal, por isso aparece essa
grande diferença.
Pela curva de desempenho podemos notar que o Merge Sort está
mais para polinomial do que logarítmico, apesar de possuir lg N em seu
desempenho, isso ocorre pois possui um N multiplicando esse lg N.

5 – Rápida
O algoritmo de ordenação Rápida apresentou uma diferença notável
no desempenho verificado nos testes e na previsão de complexidade, isso
ocorreu pois a previsão é uma media dos casos da aplicação do algoritmo,
portanto em determinado cenário pode aparecer diferenças consideraveis.
Pela curva do gráfico verificamos que o Quick Sort tem
comportamento polinomial com uma leve curva logaritmica, que é quase
imperceptivel, isso devido a variavel N multiplicando o lg N.

6 – Concha

O algoritmo de ordenação Concha tem um comportamento muito


diferente dos outros algoritmos analisados, pois ele é estremamente instavel
e não se pode prever com exatidão o seu comportamento, já que ele
depende demais de como os elementos estão no vetor, por isso existe
grande discrepancia com sua complexidade oficial. Ele também apresenta
uma grande diferença da sua versão invertida pra sua versão normal, não
seguindo uma curva linear.
Pelo formato da curva de complexidade ele apresenta um
comportamento levemente exponencial, mas a curva dos testes eh muito
variavel, portanto não se pode estabelecer um comportamento linear.

Conclusão:

Depois da analise de varios algoritmos de ordenação, pudemos


observar que o mais eficiente entre os analisados sem duvida é o Quick
Sort, inclusive levando em conta a complexidade de espaço utilizado, que o
torna uma opção melhor do que o Merge Sort. Como foi cientificamente
provado que é quase impossivel fazer um algoritmo mais eficiente que o
Merge e o Quick, eles são as melhores opções na maioria dos casos.

Vous aimerez peut-être aussi