You are on page 1of 23

CENTRO DE CIENCIAS EXATAS DEPARTAMENTO DE COMPUTAC AO TEORIA DA COMPUTAC AO

Algoritmos de Ordena c ao

Alunos: Andr e Ricardo Gon calves Luiz Gustavo Andrade dos Santos Paulo Roberto Silla

Profa. Linnyer Beatrys Ruiz

LONDRINA - PR 2007

Andr e Ricardo Gon calves Luiz Gustavo Andrade dos Santos Paulo Roberto Silla

Algoritmos de Ordena c ao

Trabalho apresentado ` a Universidade Estadual de Londrina, como parte de requisito de avalia c ao do 3o Bimestre da disciplina de Teoria da Computa c ao, do curso de Ci encia da Computa c ao sob orienta c ao da Profa. Linnyer Beatrys Ruiz.

LONDRINA - PR 2007

Sum ario
1 Introdu c ao 2 Algoritmos de Ordena c ao 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Bubble Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Insertion Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Selection Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Merge Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 5 6 7 8 9

Quick Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Heap Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Count Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Bucket Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Radix Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 16 17 23

3 Conclus ao Ap endice Refer encias Bibliogr acas

Cap tulo 1 Introdu c ao


M etodos ordena c ao de elementos sempre foi uma area atrativa para os pesquisadores da Ci encia da Computa c ao. Em busca de m etodos ecientes para resolver tal problema, pesquisadores analisavam algumas situa c oes do dia-a-dia, como a maneira que os jogadores de cartas ordenavam as cartas que continha, para facilit a-lo durante o jogo. Decorrente disto v arios algoritmos de ordena c ao foram apresentados, como o Bubble Sort, Selection Sort, Quick Sort, dentre outros. Este trabalho tem por objetivo apresentar de forma objetiva as principais caracter sticas de alguns m etodos de ordena c ao, suas vantagens e desvantagens, suas restri c oes e o tempo computacional de cada um deles.

Cap tulo 2 Algoritmos de Ordena c ao


Os algoritmos de ordena c ao s ao algoritmos que colocam os elementos de uma lista em uma determinada ordem, ou seja dada uma vetor de elementos de entrada n1 , n2 , n3 , ..., nk , o algoritmo ser a aplicado a este vetor de forma que a sa da seja da forma n1 nk . Existem v arios algoritmos destinados a este m, a maioria deles baseado na id eia de Inser c ao, Sele c ao e Permuta c ao. A eci encia dos algoritmos de ordena c ao e analisada segundo alguns crit erios, como a complexidade computacional, quantidade de mem oria utilizada, quanto ao uso de recurs ao, estabilidade do algoritmo e outros. Esses crit erios por sua vez s ao analisados pelo n umero de movimentos e o n umero de compara c ao efetuadas durante a execu c ao do algoritmo [Wir86]. Quanto aos crit erios apresentados, segue a deni c ao de alguns deles abaixo: Complexidade Computacional Est a relacionado com o comportamento do algoritmo no melhor, m edio e pior caso, que e denido pelo n umero de compara c oes efetuadas pelo algoritmo em rela c ao ao tamanho do vetor de entrada. A complexidade e comumente apresentada como uma fun c ao assint otica em rela c ao a n, que e igual ao n umero de elementos do vetor de entrada. Estabilidade A estabilidade e denida pela n ao realiza c ao de trocas in uteis, como a troca de elementos iguais. Um algoritmo e dito ser est avel se o mesmo n ao efetua trocas in uteis. A seguir s ao apresentados alguns dos principais algoritmos de ordena c ao, como uma breve explica c ao de seu funcionamento e algumas caracter sticas espec cas como a an alise computacional deste algoritmo. n2 n3 , ...,

2.1

Bubble Sort

um dos mais simples dos algoritmos de ordena E c ao, entretanto e o menos eciente. Considere um vetor disposto na vertical. Este m etodo bolha faz com que um elemento mais leve (menor) situado ao nal do vetor (fundo) utue at e o in cio deste. Para isso, s ao feitas compara c oes e trocas para cada par de elementos consecutivos. Ou seja, e um m etodo de permuta c ao direta que consiste em comparar um elemento com todos os elementos subseq uentes no vetor, vericando se o elemento e maior que o elemento analisado, se for, faz a troca dos elementos. Este processo e realizado at eou ltimo elemento do vetor. Complexidade de tempo: Melhor caso:
n2 2

Vetor ordenado ou quase ordenado. Pior caso: 2n2 Vetor na ordem inversa. M edio caso:
5n2 2

Assintoticamente: Todos os casos com complexidade O(n2 ) Este m etodo e um dos mais demorados que existe, por ser de ordem quadr atica at e mesmo em seu melhor caso e tamb em devido ` a grande quantidade de trocas realizadas, mas ele pode sofrer algumas melhorias: Vericar se o vetor j a est a ordenado, antes de chegar ao u ltimo elemento a ser analisado no vetor (se j a estiver ordenado, n ao h a necessidade de mais compara c oes). Neste caso, o algoritmo pode ter uma melhor performance do que a quadr atica, mas sem garantia para a maioria dos casos; Armazenar a posi c ao na qual o vetor n ao sofreu nenhuma troca, para que na pr oxima verica c ao, o algoritmo reinicie o ciclo a partir dessa marca c ao, n ao necessitando chegar at e essa posi c ao passando pelos antecessores; Alternar a dire c ao dos sucessivos passos de ordena c ao: Shake Sort, um Bubble Sort que age tanto da esquerda para a direita quanto da direita para a esquerda alternadamente (bidirecional). O Shake Sort tamb em pode utilizar armazenamento de posi c oes para os dois sentidos ou verica c ao de inaltera c ao de posi c oes. Mesmo com tais melhorias o Bubble Sort e ainda pior do que os outros algoritmos de permuta c ao. O Shake Sort e utilizado quando j a se sabe a priori se o vetor est a quase em ordem, por em este caso e muito raro na pr atica. 6

2.2

Insertion Sort

Consiste em um algoritmo simples, baseado na ordena c ao pela compara c ao durante a inser c ao. Seu funcionamento obedece a deni c ao a seguir: Deni c ao 2.1 Sejam V e V vetores. Inicialmente o n umero de elementos de V e n, enquanto V est a vazio. A cada itera c ao, um elemento de V (entrada) ser a retirado, da esquerda para a direita e inserido em V (sa da) na posi c ao correta de acordo com a ordena c ao desejada, resultando em V o vetor ordenado. Exemplo 2.1 Estado inicial: V = {3,7,4,8,1} V = Estado ap os a retirada do elemento 3 de V e, inser c ao do mesmo em V: V = {7,4,8,1} V = {3} Estado ap os a retirada do elemento 7 de V e, inser c ao do mesmo em V: V = {4,8,1} V = {3,7} Estado ap os a retirada do elemento 4 de V e, inser c ao do mesmo em V: V = {8,1} V = {3,4,7} Estado ap os a retirada do elemento 8 de V e, inser c ao do mesmo em V: V = {1} V = {3,4,7,8} Estado ap os a retirada do elemento 1 de V e, inser c ao do mesmo em V: V= V = {1,3,4,7,8} Observe que a cada estado, V est a sempre ordenado. A seguir, descrevemos as caracter sticas do Insertion Sort Implementa c ao O algoritmo possui simplicidade de implementa c ao; eciente para pequenos conjuntos de dados e tamb Eci encia E em para conjuntos onde os dados encontram-se parcialmente ordenados; Melhor caso Um vetor j a ordenado, onde e executado em tempo O(n), em que n eo tamanho da entrada; 7

Pior caso Um vetor no qual seus elementos est ao em ordem inversa, sendo executado em tempo O(n2 ), em que n e o tamanho da entrada. Tempo m edio O Insertion Sort e, em m edia, executado em tempo O(n2 ), com n representando o tamanho da entrada.

2.3

Selection Sort

O Selection Sort e baseado no seguinte princ pio: 1. Escolha o elemento de menor valor; 2. Troque os elementos do ponteiro corrente, ak , pelo elemento encontrado no passo anterior; 3. Incremente o ponteiro atual, ak+1 e repita as opera c oes anteriores agora com a apenas os n 1 elementos restantes, depois os n 2, at e restar somente um elemento, o maior deles. Neste algoritmo o n umero de compara c ao das chaves e independente da ordem inicial do vetor, assim o n umero de compara c oes e denido por: (n2 n) (2.1) 2 J a o n umero de movimenta c oes e m nimo se o vetor j a est a ordenado como mostra a C= equa c ao 2.2, e o n umero m aximo de movimenta c oes e realizado se o vetor est a ordenado na ordem inversa, como mostra a equa c ao 2.3 [Wir86]. Mmin = 3 (n 1) (2.2)

n2 + 3 (n 1) (2.3) 4 Com isso podemos concluir que os algoritmo Selection Sort e mais indicado do que o Mmax = algoritmo Insertion Sort, exceto nos seguintes casos: as chaves est ao inicialmente ordenadas; as chaves est ao inicialmente quase ordenadas.

2.4

Merge Sort

O Merge Sort aplica a t ecnica de divis ao e conquista para a ordena c ao [Goo04]. Baseia-se na jun c ao de duas seq u encias ordenadas resultando em uma u nica, tamb em ordenada. A t ecnica da divis ao e conquista para ordenar uma seq u encia S de n elementos e dividida em tr es etapas, segundo [Goo04]: 1. Divis ao: retornar S caso ela possua um ou zero elemento. Caso contr ario, remover todos os elementos de S , inserindo a primeira metade ( n/2 ) em S1 e a segunda metade ( n/2 ) em S2 ; 2. Recurs ao: ordenar S1 e S2 de modo recursivo; 3. Conquista: devolver os elementos para S , realizando um merge entre S1 e S2 de maneira a manter a seq u encia S ordenada. Abaixo notamos a gura 2.1 que mostra a execu c ao do algoritmo Merge Sort:

Figura 2.1: Exemplo da execu c ao do algotirmo Merge Sort.

Detalhando um pouco mais a divis ao nota-se que enquanto o n umero de elementos da seq u encia for maior que um, devem ser criadas duas novas seq u encias, cada uma com metade dos elementos da seq u encia anterior e o algoritmo de divis ao deve ser chamado recursivamente para essas duas novas seq ue encias. J a o processo de jun c ao deve ser realizado da seguinte maneira: remover, iterativamente, o menor elemento entre S1 e S2 e inser -lo na posi c ao nal de S . Quando uma das 9

seq u encias estiver vazia, todo o restante da outra dever a ser movido para o nal de S . [Goo04] prop oe um algoritmo, para esta nalidade, que pode ser encontrado no ap endice, com o nome de jun c ao. Podemos destacar algumas caracter sticas do Merge Sort: uma boa escolha quando a entrada n Eci encia E ao cabe totalmente na mem oria principal, tendo de ser armazenada em dispositivos mais lentos, como um disco r gido, pois aproveita melhor os dados trazidos em bloco do disco; Tempo de execu c ao N ao depende do estado inicial da seq u encia de entrada. Logo, tanto no melhor quanto no pior e, conseq uentemente no caso m edio, o Merge Sort executa em O(log2 n), com n igual ao n umero de elementos da entrada.

2.5

Quick Sort

O Quick Sort e um m etodo de ordena c ao por particionamento e e o mais eciente que se conhece considerando casos gerais, ou seja, n ao-espec cos, mas e n ao-est avel. Ele tem como base os algoritmos de ordena c ao por permuta c oes, como o BubbleSort. Por em sua estrat egia baseia-se na solu c ao de problemas conhecida como dividir para conquistar, na qual consiste em escolher um piv o, um elemento qualquer do vetor para ser o elemento que dividir a o vetor em dois segmentos (sub-vetores), sendo estes os problemas menores da estrat egia. Esta divis ao e l ogica, e n ao f sica, como acontece com o MergeSort. Ap os esta divis ao, efetua-se um processo de separa c ao dos demais elementos, tendo como par ametro de separa c ao o valor do elemento escolhido como piv o. Primeiramente, o vetor e varrido da esquerda para a direita, at e que se encontre um elemento a > piv o; e tamb em da direita para a esquerda a m de encontrar um elemento b < piv o. Assim, achado os dois elementos a e b, faz-se a troca deles. Este processo ser a realizado mais vezes, a partir de b e a, caso haja necessidade, at e que todos os elementos ` a esquerda do piv o sejam menores ou iguais a ele; e da mesma forma, todos os elementos ` a sua direita sejam maiores ou iguais. Ap os esta etapa, o elemento escolhido como piv o estar a na sua posi c ao correta em rela c ao ` a ordena c ao do vetor. No caso de n ao se conseguir escolher algum elemento em um dos segmentos, a troca e feita com o pr oprio piv o. Ap os esta parti c ao do vetor, realiza-se o processo de recurs ao para os segmentos. Estes segmentos ser ao considerados como sendo vetores originais, assim tamb em ser ao particionados, gerando seus segmentos, de tamanho cada vez menor. Assim, o processo de particionamento se repete at e que se obtenha vetores contendo apenas uma posi c ao, e com isso, todos os piv os ser ao atingidos e como estes est ao em suas devidas posi c oes, se 10

obt em a ordena c ao global. O Quick Sort apresenta diferentes tempos de ordena c ao para os casos m edio, m nimo e m aximo, pois dependem da escolha do piv o. Se o piv o for o elemento m edio e mediano (separando a mesma quantidade de elementos maiores e menores do que ele em cada lado) em toda chamada da recurs ao, o tempo e m nimo, ou seja, O(n log (n)). Caso o piv o seja o elemento maior ou menor em cada recurs ao, o tempo e m aximo, ou seja, O(n2 ). O tempo m edio se obt em quando pega o piv o aleatoriamente ou o elemento m edio. Isto e necess ario pois, quando o vetor j a estiver ordenado, ao tomar o piv o como sendo o primeiro elemento, cair a no pior caso do algoritmo. Ent ao e recomendado escolher o piv o aleatoriamente ou o elemento m edio. Carater sticas: Ordena vetores ordenados e inversamente ordenados com velocidade praticamente igual. Caso m edio (piv o aleat orio) e inferior ao caso otimo diferindo apenas por um fator logar tmico de 2 ln(2). Assim, o caso m edio possui complexidade de tempo de ordena c ao assintoticamente igual ao seu melhor caso. Prefer encia por vetores maiores e bastante desordenados. Se escolhendo no vetor o piv o como o elemento central, o caso otimo do Quick Sort e o vetor inicialmente ordenado. Considerando caso m edio, o Quick Sort e de 2 a 3 vezes mais r apido do que o Heap Sort (n ao-assint otico).

2.6

Heap Sort

O Heap Sort tamb em conhecido como m etodo de ordena c ao por arvores e baseado no m etodo de sele c ao direta. Este algoritmo utiliza um estrutura de dados chamada de heap, que consiste em uma arvore cuja raiz e o elemento de menor valor, caso seja um heap de m nimo, ou o de maior valor, caso seja um heap de m aximo. O Heap e uma estrutura de dados em forma de uma arvore, cuja raiz e o elemento m nimo ou m aximo, dependendo do tipo do heap. Para efetuar a constru c ao do heap a partir do vetor de entrada, o tempo gasto e O(n logn), em uma an alise mais complexa este tempo pode ser dado como O(n) [Wir86]. A gura 2.2 apresenta um exemplo de um heap. Com heap constru do o HeapSort apenas cria o heap a partir do vetor de entrada, e o algoritmo apenas vai removendo do heap e colocando no vetor de sa da. 11

Figura 2.2: Exemplo de um Heap de M aximo

Segundo [Wir86] o Heap Sort tem uma complexidade computacional na ordem de O(n logn), mesmo no pior caso, este valor e calculado da seguinte maneira: para a constru c ao do heap e necess ario O(n), e mais O(logn) para extrair os elementos do heap . E o n umero m edio de movimentos e de aproximadamente n/2 log (n). O Heap Sort tem vantagem sobre o Merge Sort, pois n ao necessita de mem oria auxiliar, mas uma boa implementa c ao do Quick Sort e em geral mais r apido [Miy99]. Algumas caracter sticas do Heap Sort s ao descritas abaixo: O Heap Sort n ao e recomendado para vetores de entrada com poucos elementos, devido a complexidade do heap; Quanto maior o vetor de entrada, mais eciente este algoritmo e; Mesmo no pior caso, o Heap Sort e O(n logn), este excelente desempenho no pior caso e uma das principais vantagens do Heap Sort; O Heap Sort e mais eciente com vetores de entrada, cujos elementos est ao parcialmente ordenados na ordem inversa, dando uma caracter stica n ao-natural ao algoritmo; Se o vetor de entrada estiver na ordem inversa, o processo de constru c ao do heap leva zero movimentos para ser realizado.

2.7

Count Sort

Tamb em conhecido como Counting Sort, e um m etodo de ordena c ao linear, isto e, tem complexidade O(n). Ele n ao se baseia em compara c oes, e sim em indexa c ao. Para isso, 12

os valores a serem ordenados devem ser inteiros, pois estes ser ao usados como chaves no vetor auxiliar por ele requisitado (repare que ele precisa de mem oria extra para trabalho, por em n ao e recursivo). Assim, este algoritmo n ao funciona com entradas em ponto utuante, pois se usasse uma lista encadeada, seu desempenho possivelmente n ao seria satisfat orio, devido ao percurso na lista para cada busca. Ele necessita ainda que se saiba a priori o valor do maior elemento k da entrada para criar o vetor auxiliar de contagem dos elementos da entrada, cujos valores devem variar desde 0 at e k . Importante observar que O(k ) deve ser linear para que o algoritmo tamb em o seja, o que acontece na pr atica. O algoritmo e formado por quatro la cos de repeti c ao que varrem ou o vetor original ou o de trabalho. Primeiramente ele cria o vetor de trabalho e atribui zero a todas posi c oes, consumindo O(k ). Depois varre o vetor original e incrementa as quantidades dos elementos da entrada no vetor de trabalho utilizando a indexa c ao. Assim, o tempo gasto e de apenas O(n) pois a indexa c ao consome tempo O(1). Agora ele percorre o vetor de trabalho a m de obter a quantidade de elementos menores ou iguais ao valor de cada posi c ao. Para isso, ele faz a soma do valor de uma posi c ao com a anterior, come cando pela segunda e indo at eau ltima. Este la co leva O(k ). Por u ltimo, cursa o vetor de entrada ao contr ario, para assim garantir estabilidade. Essa propriedade e importante quando se trabalha com outros dados junto ao elemento que sofrer a ordena c ao, mas para isso ser a necess ario outro vetor auxiliar, o vetor de sa da. Este vetor, logicamente ter a o mesmo tamanho da entrada, e ser a preenchido da seguinte forma: o elemento de entrada ser a colocado na posi c ao de sa da indicada pelo seu pr oprio valor no vetor de trabalho. Logo em seguida, decrementase o valor da contagem do vetor de trabalho na posi c ao utilizada, para que, quando ocorra repeti c ao de elementos na entrada, estes n ao ocupem o mesmo lugar no vetor de sa da. Esta etapa tamb em e O(n), e no total temos O(k )+ O(n)+ O(k )+ O(n) = O(n), adotando que O(k ) e linear. Finalmente, n ao e recomendado usar este algoritmo quando se tem um valor muito grande de k , pois precisaria de muita mem oria e em muitos casos sem necessidade. Por outro lado, e bom utiliz a-lo quando a compara c ao dos elementos representar um problema, pois este m etodo usa opera c oes aritm eticas e atribui c oes para fazer a ordena c ao ao inv es de compara c oes.

2.8

Bucket Sort

Algoritmo baseado na id eia do uso de chaves como ndices em um arranjo B de Buckets. Tal arranjo, possui entradas no intervalo de 0 a [N 1], onde N representa a quantidade de chaves. Cada posi c ao de B e uma lista de itens. Por exemplo, o elemento f ser a armazenado em B [f ]. 13

O Bucket Sort funciona da seguinte maneira: seja S a seq u encia que deseja-se ordenar. Cada elemento de S e inserido em seu Bucket. Em seguida, ordena-se os Buckets e o conte udo e devolvido em S . Para garantir a estabilidade desse algoritmo, deve-se, segundo [Goo04] remover sempre o primeiro elemento da seq u encia S e das seq u encias B [i]. O Bucket Sort possui tempo de execu c ao O(n + N ) onde n representa a quantidade de elementos na sequ u encia S . Apresenta bom desempenho quando N e pequeno se comparado com n. No melhor caso, espera-se que cada elemento de S seja armazenado em um Bucket diferente e, em contrapartida, em seu pior caso, todos os elementos da seq u encia s ao armazenados no mesmo Bucket.

2.9

Radix Sort

O Radix Sort e um algoritmo baseado no conceito de ordena c ao por contagem, que consiste em criar uma tabela de N entradas, onde N e o n umero de elementos diferentes que pode ser inseridos no vetor de entrada. E nesta tabela s ao inseridos contadores, incrementadoos se os mesmos forem correspondentes a chave de valor i, ap os realizado este processo, e conhecido a quantidade de posi c oes necess arias para cada valor de chave, assim os elementos s ao transferidos para as posi c oes corretas no novo vetor ordenado[Ric03]. O Radix Sort utiliza o conceito de ordena c ao por contagem, por em ele realiza a contagem com apenas uma parte da representa c ao do elemento, a qual e denominada raiz. O processo de contagem e realizado com esta parte v arias vezes at e que a representa c ao total do elemento seja analisada. Duas classica c oes podem ser realizadas com o radix sort, LSD (Least Signicant Bits) e MSD (Most Signicant Bits), que dene a ordem que ser ao analisados as partes do elemento, se LSD o processo e iniciado com os bits menos signicativos e se MSD com os bits mais signicativos. Com esta especica c ao do radix sort apresentada acima e poss vel perceber que este algoritmo pode ser aplicado a ordena c ao de strings como um vetor de entrada [bg, bd, a, f k, f j, e] sendo ordenado como [a, bd, bg, e, f j, f k ]. Este algoritmo e muito utilizado para ordena c ao lexicogr aca. Para ordena c ao de n umeros inteiros o radix sort pode trabalhar uma maneira simples, como a parte do elemento sendo um d gito do elemento, assim a ordena c ao pode ser feita ordenando os d gitos menos signcativos para os mais signicativos. Como e mostrado no exemplo 2.2: Exemplo 2.2 Dado o vetor de entrada [36, 0, 9, 25, 1, 49, 64, 16, 81, 4], realizando a or14

dena c ao pelo d gito menos signicativo, temos algo como mostrado na gura 2.3

Figura 2.3: Vetor ordenado pelo d gito menos signicativo Ap os isto, realiza-se a ordena c ao dos pr oximos d gitos, como neste caso os valores s ao no m aximo de dois d gitos, ent ao na ordena c ao do pr oximo d gito o vetor j a estar a ordenado, como e mostrado na gura 2.4.

Figura 2.4: Vetor ordenado

Uma desvantagem do Radix Sort e a necessidade de um espa co de mem oria auxiliar de tamanho N , que e o tamanho do alfabeto dos elementos de entrada. Se a quantidade de mem oria for limitada este e uma desvantagem signicante deste algoritmo. A complexidade computacional e da ordem de (i N ), onde i e o tamanho do vetor de entrada, sendo ent ao de complexidade temporal linear O(n).

15

Cap tulo 3 Conclus ao


Apresentamos, neste trabalho, alguns dos principais algoritmos de ordena c ao. Mostramos as caracter sticas de cada um, analisando o tempo computacional no melhor, pior e m edio casos. Atrav es deste estudo, pode-se concluir que n ao existe um algoritmo de ordena c ao que seja eciente para todos os casos, j a que para cada situa c ao existe um algoritmo que melhor a solucione. Um exemplo mostrado foi o caso do Merge Sort que funciona melhor em situa c oes onde a entrada n ao cabe toda na mem oria princial necessitando ser armazenada em um meio de acesso mais lento e, em contrapartida, o Quick Sort, se bem implementado, e um dos algotimos mais r apidos quando a entrada est a toda em mem oria. Podem ser realizadas pequenas modica c oes nos algoritmos originais, a m de garantir caracter sticas extras, como no caso do Bucket Sort, onde a estabilidade e garantida atrav es da remo c ao do primeiro elemento de cada seq u encia.

16

Ap endice A
Pseudo-C odigo do Algoritmo de ordena c ao Bubble Sort
Algoritmo segundo [Wir86]: BubbleSort(vetor A,n) 1. 2. 3. 4. 5. 6. 7. m para m para para i 0 ate n faca para j n - 1 decrescendo ate j = i faca se A[j] < A[j - 1] entao Troque(A[j] , A[j - 1]); m se

m do algoritmo

Pseudo-C odigo do Algoritmo de ordena c ao Insertion Sort


Algoritmo segundo [Miy99]: InsertionSort(Vetor V , Inteiro n) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. j2 enquanto j n fa ca AU X V [j ]; i j 1; enquanto i > 0 e V [i] > AU X fa ca V [i + 1] V [i]; j j 1; m enquanto V [i + 1] AU X ; j j + 1; m enquanto

m do algoritmo 17

Pseudo-C odigo do Algoritmo de ordena c ao Selection Sort


Algoritmo segundo [Wir86]: SelectionSort(A,tam) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10 11. m para m para se i = min A[min] A[i]; m se para i 1 ate tam faca min i; para j i + 1 ate tam faca se A[min] > A[j] min j; m se

m do algoritmo

Pseudo-C odigo do Algoritmo de ordena c ao Merge Sort


Algoritmo segundo [Miy99]: MergeSort(Vetor V, inicio, f im) 1. 2. 3. 4. 5. 6. se inicio < f im ent ao meio
inicio+f im 2

MergeSort(V , inicio, meio); MergeSort(V , meio + 1, f im); Juncao(V [inicio..meio], V [meio + 1..f im], V ); m se

m do algoritmo

M etodo auxiliar do Merge Sort


Jun c ao(S1 ,S2 , S ): % Entrada sequ encia S1 e S2 ordenadas de forma n ao-decrescente e uma sequ encia S vazia. % Saida sequ encia S contendo os elementos de S1 e S2 ordenados de forma n ao-decrescente com as sequ encias S1 e S2 tornando-se vazias

18

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

enquanto S1 ou S2 n ao forem vazias faca se S1 .rstElement() S2 .rstElement() ent ao {remova o primeiro elemento de S1 para o nal de S } S .insertLast(S1 .removeFirst()) sen ao {remova o primeiro elemento de S2 para o nal de S } S .insertLast(S2 .removeFirst()) {remova os elementos restantes de S1 para S } enquanto(n aoS1 .isEmpty()) fa ca S .insertLast(S1 .removeFirst()) {remova os elementos restantes de S2 para S } enquanto(n aoS2 .isEmpty()) fa ca S .insertLast(S2 .removeFirst())

m do algoritmo

Pseudo-C odigo do Algoritmo de ordena c ao Quick Sort


Algoritmo segundo [Miy99]: QuickSort(vetor V, inicio, m) 1. 2. 3. 4. 5. se inicio < m entao meio Particiona( V, inicio, m ) QuickSort( V, inicio, meio -1 ); QuickSort( V, meio + 1, m ); m se

m algoritmo

M etodo auxiliar do Quick Sort


Particiona(vetor V, inicio, m) 1. 2. 3. 4. 5. 6. 7. 8. 9. Pivo V[inicio]; ESQ inicio + 1; DIR m; enquanto ESQ < DIR faca enquanto V[ESQ] Pivo e ESQ m faca ESQ ESQ + 1; enquanto V[DIR] > Pivo e DIR inicio faca DIR DIR - 1; se ESQ < DIR entao Troque(V[ESQ], V[DIR]); m enquanto MEIO DIR; 19

10. 11.

Troque(V[inicio, V[MEIO]]); Retorne MEIO;

m do algoritmo

Pseudo-C odigo do algoritmo de Ordena c ao Heap Sort


Algoritmo segundo [Miy99]: HeapSort(A,i) 1. 2. 3. ConstroiHeap(A,i); para i n decrescendo ate 1 faca A[i] ExtraiMax(A,i);

m do algoritmo

M etodos auxiliares do Heap Sort


ConstroiHeap(A,n) 1. 2. para i [ n ] decrescendo ate 1 faca 2 Rebaixa(A,n,i);

m do algoritmo Rebaixa(A,n,i) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. pai i; fesq FilhoEsq(i); fdir FilhoDir(i); maior pai; se fesq se fdir n e A[fesq] > A[pai] n e A[fdir] > A[maior] entao maior fesq; entao maior fdir; se maior = pai entao Troca(A[maior], A[pai]); Rebaixa(A,n,maior);

m do algoritmo ExtraiMax(A,n,i) 1. 2. 3. 4. se n < 1 erro; max A[1]; A[1] A[n]; n n - 1; 20

5. 6.

Rebaixa(A,n,1); retorne max;

m do algoritmo

Pseudo-C odigo do Algoritmo de ordena c ao Count Sort


Algoritmo segundo [Miy99]: CountSort(A,B,n,k) 1. 2. 3. 4. 5. 6. 7. 8. 9. para i 1 ate k faca C[i] 1; % inicializa contadores com 0 para j 1 ate n faca C[A[i]] C[A[i]] +1; para i 2 ate k faca C[i] C[i] + C[i - 1]; para j n decrescendo ate 1 faca B[C[A[j]]] A[j]; C[A[j]] C[A[j]] - 1;

m do algoritmo

Pseudo-C odigo do Algoritmo de ordena c ao Bucket Sort


Algoritmo segundo [Miy99]: BucketSort(S ) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. m para Entrada: seq u encia S de itens com chaves inteiras no intervalo [0, N 1] Saida: seq u encia S ordenada pelas chaves, de forma n ao-decrescente seja B um arranjo de N seq u encias, cada uma inicalmente vazia para cada item x em S fa ca seja k a chave de x remove x de S e o insere no m da seq u encia B [k ] m para para i 0 ate N 1 fa ca para cada item x da seq u encia B [i] fa ca remove x de B [i] e o insere no m de S m para

m do algoritmo

21

Pseudo-C odigo do Algoritmo de Ordena c ao Radix Sort


Algoritmo segundo [Miy99]: RadixSort(A,n,d) 1. 2. para i 1 ate d faca Use um algoritmo estavel para ordenar o array A no digito i.

m do algoritmo

22

Refer encias Bibliogr acas


[Goo04] Michael T. Goodrich. Projeto de algoritmos: Fundamentos, an alise e exemplos da Internet. Editora Bookman, 2004. [Miy99] F. K. Miyazawa. Notas de complexidade de algoritmos. Universidade Estadual de Campinas, 1999. [Ric03] Ivan L. M. Ricarte. Ordena c ao por contagem. Dispon vel em:

http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node24.html. Acessado em: 09 Ago. 2007, 2003. [Wir86] Niklaus. Wirth. Algoritmos e Estruturas de Dados. Editora Prentice Hall, 1986.

23

You might also like