Estrutura de Dados

10
Alexandre S. Ferreira, Gilson V. Guimarães e Henrique E. Viana [email protected] , [email protected] , [email protected] 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.

Transcript of Estrutura de Dados

Page 1: Estrutura de Dados

Alexandre S. Ferreira, Gilson V. Guimarães e Henrique E. [email protected], [email protected], [email protected]

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.

Page 2: Estrutura de Dados

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.

Page 3: Estrutura de Dados

Pseudocódigoprocedimento QuickSort(X[], IniVet, FimVet)var i, j, pivo, auxinício i <- IniVet j <- FimVet pivo <- X[(IniVet + FimVet) div 2] repita | enquanto (X[i] < pivo) faça | | i <- i + 1 | fimEnquanto | enquanto (X[j] > pivo) faça | | j <- j - 1 | fimEnquanto | se (i <= j) então | | 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 | | | QuickSort(X, IniVet, j) | | fimSe | | se (i < FimVet) então | | | QuickSort(X, i, FimVet) | | fim | fimEnquanto fim

Page 4: Estrutura de Dados

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:

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

melhor do que o limite de para algoritmos sequenciais.

Vantagens do Quicksort paralelo1 - 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.

Page 5: Estrutura de Dados

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

5 - Nova recursão.

Page 6: Estrutura de Dados

6 - Chamada do Quicksort sequencial por cada processo.

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.

Page 7: Estrutura de Dados

CocktailCocktail 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²)

Page 8: Estrutura de Dados

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 sortedend procedure

Page 9: Estrutura de Dados

Benchmark comparativoFizemos 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:

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

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.

Page 10: Estrutura de Dados

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: http://homepages.dcc.ufmg.br/~vado/cursos/sisop971/aulas/notas/node126.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.pp t . Acessado em 24/06/2011