You are on page 1of 8

UNIVERSIDADE FEDERAL DO PARAN SETOR DE EDUCAO PROFISSIONAL E TECNOLOGICA

FELICIANO PAULO KAVA GUSTAVO FERNANDES DA SILVA LEOMAR MENEZES

ANALISE DE ALGORITMOS DE ORDENAO: INSERO, SHELL, QUICKSORT E MERGESORT.

Trabalho apresentado disciplina de Algoritmos e Logica de Programao II do curso de Tecnologia em Anlise e Desenvolvimento de Sistemas, na UFPR, Prof. Luiz A. P. Neves.

CURITIBA, OUTUBRO DE 2012.

1. INTRODUO O objetivo desse trabalho analisar alguns tipos de algoritmos de ordenao, que na proposta inicial eram o algoritmo Shell e o algoritmo Insero. Conforme combinado com o Professor Neves, apresentamos quatro algoritmos de ordenao: Insero, Shell, QuickSort e MergeSort. Ainda conforme combinado com o Professor Neves, no exporemos os algoritmos usando pseudocdigo, somente a implementao em C dos mesmos.

2. ANALISE DOS ALGORITMOS No mundo da computao, talvez as tarefas mais fundamentais e extensivamente analisadas sejam ordenao e pesquisa. Essas rotinas so utilizadas em praticamente todos os programas de banco de dados, bem como em compiladores, interpretadores e sistemas operacionais. O objetivo principal de ordenar os dados geralmente facilitar e acelerar o processo de pesquisa nesses dados. Ordenao o processo de arranjar um conjunto de informaes semelhantes numa ordem crescente ou decrescente. Especificamente, dada uma lista ordenada i de n elementos, ento: i1 <= i2 <= ... <= in Muito embora a maioria dos compiladores fornea a funo qsort() como parte da biblioteca padro, devemos entender a ordenao por trs razes. Primeiro, no possvel aplicar uma funo generalizada como qsort() a todas as situaes. Segundo, pelo fato de qsort() ser parametrizada para operar em uma variedade de dados, ela roda mais lentamente que uma ordenao semelhante que opera sobre apenas um tipo de dado. (Generalizao aumenta inerentemente o tempo de execuo devido ao tempo de processamento extra necessrio para manipular os diversos tipos de dados.) Finalmente, embora o algoritmo QuickSort (usado por qsort()) seja muito eficiente no caso geral, ele pode no ser a melhor ordenao para situaes especiais. Existem muitos algoritmos diferentes para cada mtodo de ordenao. Cada um deles tem seus mritos, mas os critrios gerais para avaliao de um algoritmo so: Em que velocidade ele pode ordenar as informaes no caso mdio? Qual a velocidade do seu melhor e pior casos? Esse algoritmo apresenta um comportamento natural ou no-natural? Ele rearranja elementos com chaves iguais? Olhe, agora, atentamente para esses critrios. Evidentemente a velocidade em que um algoritmo particular ordena de grande importncia. A velocidade em que uma matriz pode ser classificada est diretamente relacionada com o nmero de comparaes e o nmero de trocas que ocorrem, com as trocas exigindo mais tempo. Uma comparao ocorre quando um elemento da matriz comparado a outro; uma troca ocorre quando dois elementos na matriz ocupam um o lugar do outro. Algumas ordenaes variam o tempo de ordenao de um elemento de forma exponencial e outras de forma logartmica.

Os tempos de processamento para o pior e melhor casos so importantes se voc espera, frequentemente, encontrar uma dessas situaes. Normalmente, uma ordenao tem um bom caso mdio, mas um terrvel pior caso. Diz-se que uma ordenao tem um comportamento natural se ela trabalha o mnimo quando a lista j est ordenada, trabalha mais quanto mais desordenada estiver a lista e o maior tempo quando a lista est em ordem inversa. A determinao do quanto uma ordenao trabalha baseada no nmero de comparaes e trocas que ela deve executar. Para entender por que rearranjar elementos com chaves iguais pode ser importante, imagine um banco de dados como uma lista postal, que ordenada de acordo com uma chave principal e uma subchave. A chave principal o CEP e, dentro dos cdigos de CEP, o sobrenome a subchave. Quando um novo endereo for acrescentado lista e esta for reordenada, as subchaves (isto , os sobrenomes com os mesmos cdigos de CEP) no devem ser arranjadas. Para garantir que isso no acontea, uma ordenao no deve trocar as chaves principais de mesmo valor.

2.1. ORDENACO POR INSERO A ordenao por insero um algoritmos simples de ordenao. Inicialmente, ela ordena os dois primeiros membros da matriz. Em seguida, o algoritmo insere o terceiro membro na sua posio ordenada com relao aos dois primeiros membros. Ento, insere o quarto elemento na lista dos trs elementos. O processo continua at que todos os elementos tenham sido ordenados. Por exemplo, dada a matriz DCAB, cada passo da ordenao por insero mostrado aqui: Inicial Passo 1 Passo 2 Passo 3 D C A A C D C B A A D C B B B D

O nmero de comparaes que ocorrem durante a ordenao por insero depende de como a lista est inicialmente ordenada. Se a lista estiver em ordem, o nmero de comparaes ser n-1. Se estiver fora de ordem, o nmero de comparaes ser . O caso mdio .

O nmero de troca para cada caso o seguinte Melhor mdio . .

pior

A ordenao por insero a se comporta naturalmente, isto , trabalha menos quando a matriz j est ordenada e o mximo quando a matriz est ordenada no sentido inverso. Isso torna a ordenao por insero excelente para listas que esto quase em ordem. A segunda vantagem que ela no rearranja elementos de mesma chave. Isso significa que urna lista que ordenada por duas chaves permanece ordenada para ambas as chaves aps uma ordenao por insero. Muito embora o nmero de comparaes possa ser razoavelmente baixo para certos conjuntos de dados, a matriz precisa ser deslocada cada vez que um elemento colocado na sua posio correta. Corno resultado, o nmero de movimentaes pode ser significativo.
void ordInsercao(int *registro, int qtdeReg){ int i, j; int aux; for(i = 1; i < qtdeReg; i++){ j = i; while(registro[j]< registro[j-1]) { aux = registro[j]; registro[j] = registro[j - 1]; registro[j - 1] = aux; j--; if(j == 0)break; } } }

2.2. ORDENACAO SHELL A ordenao Shell assim chamada devido ao seu inventor, D. L. Shell. Porm, o nome provavelmente pegou porque seu mtodo de operao frequentemente descrito como conchas do mar empilhadas umas sobre as outras. O mtodo geral derivado da ordenao por insero e baseado na diminuio dos incrementos. Primeiro, todos os elementos que esto trs posies afastados um do outro so ordenados. Em seguida, todos os elementos que esto duas posies afastados so ordena- dos. Finalmente, todos os elementos adjacentes so ordenados.

A sequncia exata para os incrementos pode mudar. A nica regra que o ltimo incremento deve ser 1. Por exemplo, a sequncia 9,5,3,2,1 funciona bem e usada na ordenao Shell mostrada aqui.
void ordShell(int *registros, int qtdeReg) { int i , j; int tmp; int step = 1; do{ step=3*step+1; }while(step<qtdeReg); do{ step/=3; for(i=step; i<qtdeReg; i++) { tmp=registros[i]; j=i-step; while(j>=0 && tmp < registros[j]) { registros[j+step]=registros[j]; j-=step; } registros[j+step]=tmp; } }while(step>1); }

A anlise da ordenao Shell apresenta alguns problemas matemticos que esto alm do objetivo desta discusso. O tempo de execuo proporcional a para se ordenar n elementos.

2.3. ORDENACAO QUICKSORT A QuickSort, inventada e denominada por C.A.R. Hoare, geralmente considerada o melhor algoritmo de ordenao de propsito geral atualmente disponvel. baseada no mtodo de ordenao por trocas. A QuickSort baseada na ideia de parties. O procedimento geral selecionar um valor, chamado de comparando, e, ento, fazer a partio da matriz em duas sees, com todos os elementos maiores ou iguais ao valor da partio de um lado e os menores do outro. Esse processo repetido para cada seo restante at que a matriz esteja ordenada. Por exemplo, dada a matriz FEDACB e usando o valor D para a partio, o primeiro passo da QuickSort rearranja a matriz como segue:

Inicio Passo 1

F B

E C

D A

A D

C E

B F

Esse processo , ento, repetido para cada seo - isto , BCA e DEF. o processo essencialmente recursivo por natureza e, certamente, as implementaes mais claras da QuickSort so algoritmos recursivos. o valor do comparando intermedirio pode ser escolhido de duas formas. Escolh-lo aleatoriamente ou selecion-lo fazendo a mdia de um pequeno conjunto de valores retirado da matriz. Para uma ordenao tima, selecionar um valor que estivesse precisamente no centro da faixa de valores. Porm, isso no fcil para a maioria dos conjuntos de dados. No pior caso, o valor escolhido est em uma extremidade e, mesmo nesse caso, QuickSort ainda tem um bom rendimento. A verso seguinte da QuickSort seleciona o elemento intermedirio da matriz. Embora isso nem sempre resulte em uma boa escolha, a ordenao ainda efetuada corretamente. O nmero mdio de comparaes aproximadamente . e o nmero mdio de trocas

Esses nmeros so significativamente menores do que para qualquer outra ordenao. No entanto, existe um aspecto particularmente problemtico de QuickSort . Se o valor do comparando, para cada partio, for o maior valor, ento a QuickSort

se degenerar em uma ordenao lenta com um tempo de processamento n. Geralmente, porm, isso no acontece. Deve-se escolher com cuidado um mtodo para definir o valor do comparando. O mtodo frequentemente determinado pelo tipo de dado que est sendo ordenado. Em listas postais muito grandes, onde a ordenao frequentemente feita por meio do cdigo CEP, a seleo simples, porque os cdigos so razoavelmente distribudos. uma simples funo algbrica pode determinar um comparando adequado. Porm, em certos bancos de dados, as chaves podem ser iguais ou muito prximas em valor e uma seleo randmica frequentemente a melhor. Um mtodo comum e satisfatrio tomar uma amostra com trs elementos de uma partio e utilizar o valor mdio.
void qs(int *registro, int eq, int dr){ register int i = eq, j = dr; int pivo, tmp; pivo = registro[(i + j) / 2]; do{ while (registro[i] < pivo && i < dr) i++; while (registro[j] > pivo && j > eq) j--; if (i <= j){ tmp = registro[i]; registro[i] = registro[j]; registro[j] = tmp; i++, j--; } } while (i <= j); if (eq < j) qs(registro, eq, j); if (i < dr) qs(registro, i, dr); }

You might also like