You are on page 1of 17

UNIVERSIDADE DO CONTESTADO UNC/CONCRDIA Curso: Sistemas de Informao 1/2012 3 Fase 20/06/2012 Disciplina: Estruturas de Dados Professor: Maximiliano Zambonatto

tto Pezzin Acadmica: Daiana Paula de vila Introduo Em vrios momentos do dia a dia, o homem depara-se com a necessidade de consultar dados ordenados. Como exemplo, pode-se citar uma lista telefnica. Imagine como seria consultar o telefone de uma pessoa se os nomes no estivessem classificados em ordem alfabtica. Por isso uma das atividades mais utilizada na computao a ordenao. As ordens mais utilizadas so as nmericas e as lexicogrficas. Existem diversos algoritmos para ordenao interna. No presente trabalho ser apresentada a implementao e os testes de seis destes mtodos. Bubble Sort Insertion Sort Selection Sort Shell Sort Quick Sort Heap Sort Merge Sort Os testes foram realizados com vetores de nmeros inteiros de tamanho 25 e tipos (ordenados em ordem crescente e decrescente, aleatrios e parcialmente ordenados com apenas 20% dos elementos fora da ordem). Como medida para a comparao entre os mtodos foi colhido durante cada teste: 1. Nmero de comparaes entre chaves do vetor; 2. Nmero de movimentaes; 3. Contagem do tempo gasto durante a execuo do algoritmo;

Mtodos de Ordenao Ordenar corresponde ao processo de rearranjar um conjunto de objetos em ordem ascendente ou descendente. O objetivo principal da ordenao facilitar a recuperao posterior de itens do conjunto ordenado. Os mtodos de ordenao so classificados em dois grandes grupos: ordenao interna e externa. 1. Ordenao Interna: So os mtodos que no necessitam de uma memria secundria para o processo, a ordenao feita na memria principal do computador; 2. Ordenao Externa: Quando o arquivo a ser ordenado no cabe na memria principal e, por isso, tem de ser armazenado em fita ou disco. A principal diferena entre os dois grupos que no mtodo de ordenao interna qualquer registro pode ser acessado diretamente, enquanto no mtodo externo necessrio fazer o acesso em blocos. Bubble Sort o mtodo mais simples em termos de implementao, porm o menos eficiente. A idia principal do algoritmo percorrer o vetor n - 1 vezes, a cada passagem fazendo flutuar para o inicio o menor elemento da sequncia. Seu uso no recomendado para vetores com muitos elementos.

Ilustrao do funcionamento do algoritmo Bubble Sort.

Implementao O algoritmo procede da seguinte forma: 1. Zera os valores das vriveis de medio atravs do mtodo ClearAll(); 2. Inicia a contagem de tempo com a funo start(); 3. Percorre o vetor, trazendo para o incio o menor elemento encontrado; 4. A cada comparao incrementa a varivel mComparations e a cada movimentao incrementa a varivel mMoviments;

5. Pausa a contagem de tempo e calcula o tempo gasto armazenando o valor na varivel mTime; Uma maneira mais eciente de implementao do BubbleSort consiste em parar o processo logo que se detecte que, ao longo de uma passagem no foram efetuadas trocas de chaves. Anlise do algoritmo O Bubble Sort um mtodo de simples implementao, porm a sua eficincia a menor entre os mtodos de ordenao interna]. Admite contudo vrios melhoramentos e tambm uma boa base para a construo de mtodos mais elaborados Vantagens - Fcil Implementao; - Algoritmo Estvel; Desvantagens - O fato de o arquivo j estar ordenado no ajuda em nada [7]; - Ordem de complexidade quadrtica; Insertion Sort Insertion Sort um algoritmo elementar de ordenao. eficiente quando aplicado um vetor com poucos elementos. Em cada passo, a partir de i = 2, o i-simo item da sequncia fonte apanhado e transferido para a sequncia destino, sendo inserido no seu lugar apropriado.

Ilustrao do funcionamento do algoritmo Insertion Sort.

Implementao O algoritmo procede da seguinte maneira: 1. Zera os valores das variveis de medio atravs do mtodo ClearAll(); 2. Inicia a contagem de tempo com a funo start(); 3. O primeiro lao de repetio tem a funo de controlar o tamanho da sequncia analisada; 4. O segundo lao responsvel de colocar o novo elemento da sequncia, em relao anterior, no lugar apropriado; 5. A cada comparao incrementa a varivel mComparations e a cada movimentao incrementa a varivel mMoviments; 6. Pausa a contagem de tempo e calcula o tempo gasto armazenando o valor na varivel mTime;

Uma soluo melhor, mas que no ser utilizada durante os testes, a utilizao de um registro sentinela: na posio zero do vetor coloca-se o prprio registro em considerao. Assim evitando duas comparaes no anel mais interno do algoritmo, porm seria necessrio uma implementao do vetor a partir do ndice 1, e no de 0 como proposto neste trabalho.

Anlise do algoritmo O InsertSort tambm um mtodo de simples implementao, e tem a complexidade igual ao BubbleSort . Pode ser aprimorado com o uso de sentinela e outras tcnicas de algoritmos. o melhor mtodo para se utilizar quando os arquivos j esto quase ordenados. Vantagens - Fcil Implementao - Algoritmo Estvel - O vetor j ordenado favorece a ordenao Desvantagens - Nmero grande de movimentaes - Ordem de complexidade quadrtica - Ineficiente quando o vetor est ordenado inversamente; Selection Sort Tem como principio de funcionamento selecionar o menor item do vetor e a seguir troc-lo pela primeira posio do vetor. Isto ocorre para os n-1 elementos restantes, depois com os n-2 itens, at que reste apenas um elemento. A principal diferena destes mtodos em relao aos dois j apresentados que ele realiza apenas uma troca por iterao.

Ilustrao do funcionamento do algoritmo Selection Sort.

Implementao A colocao do item no seu lugar correto na sequncia ordenada, realizada trocando o item de menor valor pela primeira posio do vetor. O algoritmo procede da seguinte forma: 1. Zera os valores das variveis de medio atravs do mtodo ClearAll(); 2. Inicia a contagem de tempo com a funo start(); 3. O primeiro lao determina a dimenso de busca do menor elemento; 4. O segundo lao responsvel por realizar a busca pelo menor elemento;

5. Feito a busca realizada a troca do menor elemento pelo primeiro elemento; 6. Aps a troca o processo realizado novamente para os n-i itens restantes; 7. A cada comparao incrementa a varivel mComparations e a cada movimentao incrementa a varivel mMoviments; 8. Pausa a contagem de tempo e calcula o tempo gasto armazenando o valor na varivel mTime; Anlise do algoritmo O Selection Sort um mtodo muito simples. Alm disso, o algoritmo de seleo apresenta um comportamento espetacular quanto ao nmero de movimentos de registros, cujo tempo de execuo linear, esta particularidade dificilmente encontrada em outros algoritmos de ordenao. o algoritmo ideal para arquivos com registros muito grandes. Vantagens - Fcil Implementao - Pequeno nmero de movimentaes - Interessante para arquivos pequenos Desvantagens - O fato de o arquivo j estar ordenado no influencia em nada - Ordem de complexidade quadrtica - Algoritmo no estvel ShellSort Este algoritmo uma extenso do mtodo Insertion Short proposto por Donald Shell em 1959. O algoritmo de insero troca itens adjacentes quando est procurando o ponto de insero na sequncia destino. Se o menor item estiver na posio mais direita no vetor, ento o nmero de comparaes e movimentaes igual a n-1 para encontrar o seu ponto de insero. O ShellSort contorna este problema, permitindo trocas de registros distantes um do outro. De maneira geral ele passa vrias vezes no vetor dividindo-o em vetores menores, e nestes so aplicados o

algoritmo de ordenao por insero tradicional. Dentre os programas de ordenao interna que tem ordem de complexidade quadrtica,o ShellSort o mais eficiente. Ilustrao do funcionamento do algoritmo ShellSort.

Implementao O diferencial do ShellSort a diviso em h intervalos que ele realiza para posteriormente aplicar o mtodo de insero. Vrias sequncias para h tm sido experimentadas. Knuth(1973) mostrou experimentalmente que a escolha do incremento para h, mostrada a seguir na Equao 2.7 difcil de ser batida em mais de 20% dos casos em ecincia no tempo de execuo. O algoritmo procede da seguinte forma: 1. Zera os valores das variveis de medio atravs do mtodo ClearAll(); 2. Inicia a contagem de tempo com a funo start(); 3. O algoritmo usa uma varivel auxiliar denominada distncia de comparao (h); 4. O valor de h inicializado com um valor prximo de n=2; 5. A troca feita entre elementos que esto distanciados h posies (se estiverem fora de ordem); 6. Aps todas as trocas de elementos cuja distancia h, o valor de h deve ser reduzido: conforme Equao 2.7; 7. O algoritmo repetido at que a distncia de comparao h seja igual a um (h = 1); 8. Para h = 1 (ultima passada) executado o algoritmo de insero; 9. A cada comparao incrementa a varivel mComparations e a cada movimentao incrementa a varivel mMoviments; 10. Pausa a contagem de tempo e calcula o tempo gasto armazenando o valor na varivel mTime; Anlise do algoritmo O ShellSort uma tima opo para arquivos de tamanho moderado, mesmo porque sua implementao simples e requer uma quantidade de cdigo pequena. Vantagens - Cdigo Simples - Interessante para arquivos de tamanho moderado Desvantagens

- Algoritmo no estvel - Tempo de execuo sensvel ordem inicial do arquivo. QuickSort o algoritmo mais rpido que se conhece entre os de ordenao interna para uma ampla variedade de situaes. Foi escrito em 1960 e publicado em 1962 por C. A. R. Hoare aps vrios refinamentos. Porm em raras instncias especiais ele lento. Adotando a estratgia Dividir para conquistar o funcionamento resume-se a dividir o problema de ordenar um vetor de n posies em dois outros menores. O QuickSort provavelmente o mais utilizado, porm a sua implementao demanda um pouco mais de pacincia e cautela. Ilustrao do funcionamento do algoritmo QuickSort.

Implementao A parte crucial do algoritmo o mtodo Partition quem tem a funo de rearranjar o vetor por meio da escolha de um piv, de tal forma que ao final o vetor estar particionado em uma parte esquerda com chaves menores ou iguais ao piv e outra maiores ou iguais. O algoritmo procede da seguinte forma: 1. Zera os valores das variveis de medio atravs do mtodo ClearAll(); 2. Inicia a contagem de tempo com a funo start(); 3. Escolha um elemento aux1 do vetor Array para ser o piv; 4. Usando aux1 divida o vetor Array em duas partes, da seguinte maneira: Comeando com i = posio inicial, percorra o vetor em forma crescente at que um elemento Array[i] = aux1 seja encontrado. Comeando com j = posio nal, percorra o vetor em forma descendente at que um elemento A[j] = X seja encontrado; Se i <= j, troque Array[i] com Array[j]; Continue percorrendo o vetor procurando elementos Array[i] e Array[j] at que os contadores i e j se cruzem (j < i). 5. Repita, recursivamente, os passos 3 e 4 para as duas partes 6. A cada comparao incrementa a varivel mComparations e a cada movimentao incrementa a varivel mMoviments; 7. Pausa a contagem de tempo e calcula o tempo gasto armazenando o valor na varivel mTime; Anlise do algoritmo O QuickSort considerado o mtodo mais eciente e altamente recomendvel para arquivos grandes. Quanto mais o vetor estiver desordenado, maior ser sua vantagem em relao aos outros mtodos. A escolha correta do piv essencial para a garantia de ecincia do algoritmo. Vantagens - Extremamente Eficiente - Necessita apenas de um pequena pilha como memria extra

- Complexidade n log n Desvantagens - Tem um pior caso de O(n2) - Implementao difcil - No estvel

MergeSort outro algoritmo de ordenao do tipo dividir para conquistar. Sua idia bsica criar uma sequncia ordenada a partir de duas outras tambm ordenadas. Para isso, ele divide a sequncia original em pares de dados, ordena-as; depois as agrupa em sequncias de quatro elementos, e assim por diante, at ter toda a sequncia dividida em apenas duas partes. Ilustrao do funcionamento do algoritmo MergeSort.

Os trs passos teis dos algoritmos dividir para conquistar, ou divide and con-quer, que se aplicam ao MergeSort so: 1. Dividir: Dividir os dados em subsequncias pequenas; 2. Conquistar: Classificar as duas metades recursivamente aplicando o mergesort; 3. Combinar: Juntar as duas metades em um nico conjunto j classificado. Implementao O algoritmo procede da seguinte forma: 1. criado um vetor auxiliar do tamanho do intervalo; 2. Copia os valores do intervalo para o vetor auxiliar, de forma ordenada; 3. Copia o vetor auxiliar para o intervalo correspondente ao vetor a ser ordenado.

Vantagens - Passvel de ser transformado em estvel - Fcil Implementao - Complexidade O(n log n) Desvantagens - Utiliza memria auxiliar - Mais lento que o HeapSort

Testes Aqui sero apresentados os resultados dos testes realizados. Os algoritmos de ordenao foram escritos na linguagem Java. 3.2 Resultados Foram testados os seis mtodos de ordenao, para todos os mtodo foi testado um tamanho igual de vetor (25) e para cada tamanho um tipo diferente (Ordenado Crescente, Ordenado Decrescente, Ordenado Aleatrio e parcialmente Aleatrio). Os resultados aqui apresentado a mdia dos valores. Os mtodos sero numerados para apresentao na tabela, conforme a lista abaixo: 1. Bubble Sort 2. Insertion Sort 3. Selection Sort 4. ShellSort 5. Quick Sort 6. Merge Sort