Sunteți pe pagina 1din 10

Alexandre S. Ferreira, Gilson V. Guimarães e Henrique E. Viana alex_o.0_4fun@hotmail.com, gilsonmsm@hotmail.com, hv5088@gmail.com

Universidade Estadual/Federal

Palavras-chave: Ordenação, algoritmo, matriz, quick, cocktail, sort

Resumo:

Explicaremos a história e o funcionamento de dois algoritmos de ordenação, o Quick Sort e o Cocktail Sort.

Introdução Algoritmo de ordenação em ciência da computação é um algoritmo que coloca os elementos de uma dada sequência em uma certa ordem -- em outras palavras, efetua sua ordenação completa ou parcial. As ordens mais usadas são a numérica e a lexicográfica.

Existem várias razões para se ordenar uma sequência. Uma delas é a possibilidade se acessar seus dados de modo mais eficiente.

Materiais e Métodos

Quicksort

O algoritmo Quicksort é um método de ordenação muito rápido e eficiente, inventado por C.A.R. Hoare em 1960, quando visitou a Universidade de Moscovo como estudante. Naquela época, Hoare trabalhou em um projeto de tradução de máquina para o National Physical Laboratory. Ele criou o Quicksort ao tentar traduzir um dicionário de inglês para russo, ordenando as palavras, tendo como objetivo reduzir o problema original em subproblemas que possam ser resolvidos mais fácil e rapidamente. Foi publicado em 1962 após uma série de refinamentos.

O algoritmo:

O Quicksort adota a estratégia de divisão e conquista. A estratégia consiste em rearranjar as chaves de modo que as chaves "menores" precedam as chaves "maiores". Em seguida o Quicksort ordena as duas sublistas de chaves menores e maiores recursivamente até que a lista completa se encontre ordenada. Os passos são:

1. Escolha um elemento da lista, denominado pivô;

2. Rearranje a lista de forma que todos os elementos anteriores ao pivô sejam menores que ele, e todos os elementos posteriores ao pivô sejam maiores que ele. Ao fim do processo o pivô estará em sua posição final e haverá duas sublistas não ordenadas. Essa operação é denominada partição;

3. Recursivamente ordene a sublista dos elementos menores e a

sublista dos elementos maiores; A base da recursão são as listas de tamanho zero ou um, que estão sempre ordenadas. O processo é finito, pois a cada iteração pelo menos um

elemento é posto em sua posição final e não será mais manipulado na iteração seguinte.

Complexibilidade

Complexidade de tempo: θ(n lg2 n) no melhor caso e no caso médio e θ(n2) no pior caso;

Complexidade de espaço: θ(lg2 n) no melhor caso e no caso médio e θ(lg2 n) no pior caso. R. Sedgewick desenvolveu uma versão do Quicksort com partição recursão de cauda que tem complexidade θ(n2) no pior caso.

Pseudocódigo

procedimento QuickSort(X[], IniVet, FimVet) var i, j, pivo, aux início

i <- IniVet

j <- FimVet

pivo <- X[(IniVet + FimVet) div 2]

repita

| enquanto (X[i] < pivo) faça

|

| fimEnquanto

| enquanto (X[j] > pivo) faça

|

| fimEnquanto

| se (i <= j) então

|

|

i <- i + 1

j <- j - 1

| aux

|

<- X[i]

| |

X[i] <- X[j]

| |

X[j] <- aux

| |

i <- i + 1

| |

j <- j - 1

| fimSe

| enquanto (i < j)

| se (j > IniVet) então

|

|

| se (i < FimVet) então

|

|

|

|

QuickSort(X, IniVet, j) fimSe

|

| | QuickSort(X, i, FimVet)

|

| fimEnquanto

|

|

fim

fim

Quicksort Paralelo - Análise

Supondo que o pivô escolhido é sempre a mediana, o algoritmo fará n comparações na primeira partição. No segundo nível de recursividade serão feitas duas partições, cada uma de tamanho n/2; no total serão também feitas n comparações. Entretanto, como as partições são feitas simultaneamente, o tempo gasto será proporcional a n/2. No terceiro nível, teremos quatro partições simultâneas, cada uma de tamanho n/4, e assim por diante. Desta forma, o tempo total gasto será dado pela soma:

Desta forma, o tempo total gasto será dado pela soma: Temos portanto um Sort com complexidade

Temos portanto um Sort com complexidade (para o melhor caso) de

melhor do que o limite de

(para o melhor caso) de melhor do que o limite de para algoritmos sequenciais. , Vantagens

para algoritmos sequenciais.

,
,

Vantagens do Quicksort paralelo

1 - Considerado dos algoritmos mais rápidos.

2 - Tem concorrência natural.

3 - Não é necessário haver sincronização.

Desenvolvimento:

1 - Valores divididos ao longo dos processos.

2.1 - Escolha do pivô.

2.2 - Divulgação do pivô por cada processo.

1 - Valores divididos ao longo dos processos. 2.1 - Escolha do pivô. 2.2 - Divulgação

3

- Divisão dos números de cada processo por duas listas.

4 - Troca de sub-listas entre processos.

3 - Divisão dos números de cada processo por duas listas. 4 - Troca de sub-listas

5 - Nova recursão.

3 - Divisão dos números de cada processo por duas listas. 4 - Troca de sub-listas
3 - Divisão dos números de cada processo por duas listas. 4 - Troca de sub-listas

6 - Chamada do Quicksort sequencial por cada processo.

6 - Chamada do Quicksort sequencial por cada processo. Eficiência: Para p processadores, é possível dividir

Eficiência:

Para p processadores, é possível dividir a lista de n elementos em p sub- listas em O(n) Em relação à ordenação, esta será de O((n/p)*log(n/p).

Melhoria:

O tempo de execução do algoritmo começa quando o primeiro processo começa a sua execução, e termina quando o último processo termina a sua execução. Poderia ser feito um melhor balanceamento se fosse escolhido um pivô perto da mediana dos valores, garantindo maior divisão de trabalho pelos processos.

Cocktail Cocktail sort, também conhecido como Shaker Sort, Bubble Sort Bidirecional , ripple sort, shuttle sort ou happy hour sort, é uma variação do bubble sort que é tanto um algoritmo de ordenação estável quanto uma ordenação por comparação. O algoritmo difere do bubble sort pelo fato de ordenar em ambas as direções em cada passagem através da lista.

Funcionamento:

A ideia é percorrer o vetor diversas vezes indo e voltando, e a cada passagem colocar no topo o maior elemento da sequência e no fundo o menor elemento respectivamente. Na ida se o elemento i+1 for menor que o elemento i, troca-se a posição e diminui-se em 1 unidade o top. Na volta se o elemento i-1 for maior que o elemento i, troca-se a posição e incrementasse o bot. Faz-se isso até que o top e bot sejam iguais.

Pior Caso

О(n²)

Melhor Caso

O(n)

Caso médio

О(n²)

Pseudo-Código:

procedure cocktailSort( A : list of sortable items ) defined as:

do

swapped := false

for each i in 0 to length( A ) - 2 do:

if A[ i ] > A[ i + 1 ] then // test whether the elements are in the wrong order swap( A[ i ], A[ i + 1 ] ) // let the two elements change places swapped := true end if end for if swapped = false then // we can exit the outer loop here if no swaps occurred. break do-while loop end if swapped := false for each i in length( A ) - 2 to 0 do:

if

A[

i

]

> A[

i

+

1

] then

 

swap(

A[

i

],

A[

i

+

1

]

)

swapped := true end if end for while swapped // if no elements have been swapped, then the list is sorted end procedure

Benchmark comparativo Fizemos um Benchmark que compara o Quicksort com o Cocktailsort, o algoritmo foi feito em java, e está consideravelmente optimizado, usou-se uma maquina com um processador celeron @585 (1 core, 1 thread, FSB 667mhz, cache l2 1 MB) com 2 GB de memoria RAM, usando um sistema Windows Seven - Compilação 7601.

Ordenando 5000 elementos, com uma bateria de testes de 1000 testes:

5000 elementos, com uma bateria de testes de 1000 testes: Ordenando 50 elementos, com uma bateria

Ordenando 50 elementos, com uma bateria de testes de 1000 testes:

50 elementos, com uma bateria de testes de 1000 testes: Observamos que, no primeiro Benchmark com

Observamos que, no primeiro Benchmark com 5000 elementos, o Quicksort obteve uma eficiência muito maior que o Cocktailsort, já no segundo Benchmark, com 50 elementos, o Cocktailsort se mostrou mais eficiente. Assim concluímos que o Quicksort é muito mais eficiente que o Cocktailsort. Porém, para uma quantidade pequena de elementos a serem ordenados, o Cocktailsort se mostra mais eficiente que o Quicksort, chegando a conclusão que o Quicksort não é eficiente para ordenar uma pequena quantidade de elementos.

Considerações finais

Neste artigo concluímos que o Quicksort é realmente eficiente, em contra partida o Cocktailsort assim como o Bubblesort faz verificações que não são necessárias pois não seguem a estratégia de divisão e conquista, que é utilizada no Quicksort que faz com que seu desempenho seja superior.

Referências

[1]

Wikipédia, a enciclopédia livre: Algoritmo de Ordenação. Disponível em:http://pt.wikipedia.org/wiki/Algoritmo_de_ordena %C3%A7%C3%A3o . Acessado em 20/06/2011.

[2]

Wikipédia, a enciclopédia livre: Algoritmo de Ordenação. Disponível em:http://pt.wikipedia.org/wiki/Cocktail_sort. Acessado em 20/06/2011.

[3]

Wikipédia, a enciclopédia livre: Algoritmo de Ordenação. Disponível em:http://pt.wikipedia.org/wiki/Quicksort . Acessado em 20/06/2011

[4]

Grupo Algos, optimização e simulação de algoritmos: análise do

Quicksort.

disponível

em:

e126.html . Acessado em 24/06/2011

[5]

Blog do professor Osvaldo Sergio F. de Carvalho: Algoritmos de Ordenação. Disponível em: http://algos.inesc- id.pt/~jcm/cpd/papers/2a5/Sorting.ppt . Acessado em 24/06/2011