Você está na página 1de 23

CENTRO DE CI

ENCIAS EXATAS
DEPARTAMENTO DE COMPUTAC

AO
TEORIA DA COMPUTAC

AO
Algoritmos de Ordenacao
Alunos:
Andre Ricardo Goncalves
Luiz Gustavo Andrade dos Santos
Paulo Roberto Silla
Profa. Linnyer Beatrys Ruiz
LONDRINA - PR
2007
Andre Ricardo Goncalves
Luiz Gustavo Andrade dos Santos
Paulo Roberto Silla
Algoritmos de Ordenacao
Trabalho apresentado `a Universidade Estadual de Lon-
drina, como parte de requisito de avaliacao do 3
o
Bimestre
da disciplina de Teoria da Computacao, do curso de Ciencia
da Computacao sob orientacao da Profa. Linnyer Beatrys
Ruiz.
LONDRINA - PR
2007
Sumario
1 Introducao 4
2 Algoritmos de Ordenacao 5
2.1 Bubble Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Insertion Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Selection Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Merge Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 Quick Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6 Heap Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.7 Count Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.8 Bucket Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.9 Radix Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3 Conclusao 16
Apendice 17
Referencias Bibliogracas 23
3
Captulo 1
Introducao
Metodos ordenacao de elementos sempre foi uma area atrativa para os pesquisadores
da Ciencia da Computacao. Em busca de metodos ecientes para resolver tal problema,
pesquisadores analisavam algumas situacoes do dia-a-dia, como a maneira que os jogadores
de cartas ordenavam as cartas que continha, para facilita-lo durante o jogo. Decorrente
disto varios algoritmos de ordenacao foram apresentados, como o Bubble Sort, Selection
Sort, Quick Sort, dentre outros. Este trabalho tem por objetivo apresentar de forma
objetiva as principais caractersticas de alguns metodos de ordenacao, suas vantagens e
desvantagens, suas restricoes e o tempo computacional de cada um deles.
4
Captulo 2
Algoritmos de Ordenacao
Os algoritmos de ordenacao sao algoritmos que colocam os elementos de uma lista em uma
determinada ordem, ou seja dada uma vetor de elementos de entrada n
1
, n
2
, n
3
, ..., n
k
, o
algoritmo sera aplicado a este vetor de forma que a sada seja da forma n
1
n
2
n
3
, ...,
n
k
.
Existem varios algoritmos destinados a este m, a maioria deles baseado na ideia de
Insercao, Selecao e Permutacao.
A eciencia dos algoritmos de ordenacao e analisada segundo alguns criterios, como
a complexidade computacional, quantidade de memoria utilizada, quanto ao uso de re-
cursao, estabilidade do algoritmo e outros. Esses criterios por sua vez sao analisados
pelo n umero de movimentos e o n umero de comparacao efetuadas durante a execucao do
algoritmo [Wir86].
Quanto aos criterios apresentados, segue a denicao de alguns deles abaixo:
Complexidade Computacional Esta relacionado com o comportamento do algoritmo
no melhor, medio e pior caso, que e denido pelo n umero de comparacoes efetuadas
pelo algoritmo em relacao ao tamanho do vetor de entrada. A complexidade e
comumente apresentada como uma funcao assintotica em relacao a n, que e igual
ao n umero de elementos do vetor de entrada.
Estabilidade A estabilidade e denida pela nao realizacao de trocas in uteis, como a
troca de elementos iguais. Um algoritmo e dito ser estavel se o mesmo nao efetua
trocas in uteis.
A seguir sao apresentados alguns dos principais algoritmos de ordenacao, como uma
breve explicacao de seu funcionamento e algumas caractersticas especcas como a
analise computacional deste algoritmo.
5
2.1 Bubble Sort

E um dos mais simples dos algoritmos de ordenacao, entretanto e o menos eciente.


Considere um vetor disposto na vertical. Este metodo bolha faz com que um elemento
mais leve (menor) situado ao nal do vetor (fundo) utue ate o incio deste. Para
isso, sao feitas comparacoes e trocas para cada par de elementos consecutivos. Ou seja,
e um metodo de permutacao 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 ate o ultimo elemento
do vetor.
Complexidade de tempo:
Melhor caso:
n
2
2
Vetor ordenado ou quase ordenado.
Pior caso: 2n
2
Vetor na ordem inversa.
Medio caso:
5n
2
2
Assintoticamente:
Todos os casos com complexidade O(n
2
)
Este metodo e um dos mais demorados que existe, por ser de ordem quadratica ate
mesmo em seu melhor caso e tambem devido `a grande quantidade de trocas realizadas,
mas ele pode sofrer algumas melhorias:
Vericar se o vetor ja esta ordenado, antes de chegar ao ultimo elemento a ser
analisado no vetor (se ja estiver ordenado, nao ha necessidade de mais comparacoes).
Neste caso, o algoritmo pode ter uma melhor performance do que a quadratica, mas
sem garantia para a maioria dos casos;
Armazenar a posicao na qual o vetor nao sofreu nenhuma troca, para que na proxima
vericacao, o algoritmo reinicie o ciclo a partir dessa marcacao, nao necessitando
chegar ate essa posicao passando pelos antecessores;
Alternar a direcao dos sucessivos passos de ordenacao: Shake Sort, um Bubble
Sort que age tanto da esquerda para a direita quanto da direita para a esquerda
alternadamente (bidirecional). O Shake Sort tambem pode utilizar armazenamento
de posicoes para os dois sentidos ou vericacao de inalteracao de posicoes.
Mesmo com tais melhorias o Bubble Sort e ainda pior do que os outros algoritmos de
permutacao. O Shake Sort e utilizado quando ja se sabe a priori se o vetor esta quase em
ordem, porem este caso e muito raro na pratica.
6
2.2 Insertion Sort
Consiste em um algoritmo simples, baseado na ordenacao pela comparacao durante a
insercao. Seu funcionamento obedece a denicao a seguir:
Denicao 2.1 Sejam V e V vetores. Inicialmente o n umero de elementos de V e n,
enquanto V esta vazio. A cada iteracao, um elemento de V (entrada) sera retirado,
da esquerda para a direita e inserido em V (sada) na posicao correta de acordo com a
ordenacao desejada, resultando em V o vetor ordenado.
Exemplo 2.1 Estado inicial:
V = {3,7,4,8,1}
V =
Estado apos a retirada do elemento 3 de V e, insercao do mesmo em V:
V = {7,4,8,1}
V = {3}
Estado apos a retirada do elemento 7 de V e, insercao do mesmo em V:
V = {4,8,1}
V = {3,7}
Estado apos a retirada do elemento 4 de V e, insercao do mesmo em V:
V = {8,1}
V = {3,4,7}
Estado apos a retirada do elemento 8 de V e, insercao do mesmo em V:
V = {1}
V = {3,4,7,8}
Estado apos a retirada do elemento 1 de V e, insercao do mesmo em V:
V =
V = {1,3,4,7,8}
Observe que a cada estado, V esta sempre ordenado.
A seguir, descrevemos as caractersticas do Insertion Sort
Implementacao O algoritmo possui simplicidade de implementacao;
Eciencia

E eciente para pequenos conjuntos de dados e tambem para conjuntos onde
os dados encontram-se parcialmente ordenados;
Melhor caso Um vetor ja ordenado, onde e executado em tempo O(n), em que n e o
tamanho da entrada;
7
Pior caso Um vetor no qual seus elementos estao em ordem inversa, sendo executado
em tempo O(n
2
), em que n e o tamanho da entrada.
Tempo medio O Insertion Sort e, em media, executado em tempo O(n
2
), com n repre-
sentando o tamanho da entrada.
2.3 Selection Sort
O Selection Sort e baseado no seguinte princpio:
1. Escolha o elemento de menor valor;
2. Troque os elementos do ponteiro corrente, a
k
, pelo elemento encontrado no passo
anterior;
3. Incremente o ponteiro atual, a
k+1
e repita as operacoes anteriores agora com a apenas
os n 1 elementos restantes, depois os n 2, ate restar somente um elemento, o
maior deles.
Neste algoritmo o n umero de comparacao das chaves e independente da ordem inicial
do vetor, assim o n umero de comparacoes e denido por:
C =
(n
2
n)
2
(2.1)
Ja o n umero de movimentacoes e mnimo se o vetor ja esta ordenado como mostra a
equacao 2.2, e o n umero maximo de movimentacoes e realizado se o vetor esta ordenado
na ordem inversa, como mostra a equacao 2.3 [Wir86].
M
min
= 3 (n 1) (2.2)
M
max
=
n
2
4
+ 3 (n 1) (2.3)
Com isso podemos concluir que os algoritmo Selection Sort e mais indicado do que o
algoritmo Insertion Sort, exceto nos seguintes casos:
as chaves estao inicialmente ordenadas;
as chaves estao inicialmente quase ordenadas.
8
2.4 Merge Sort
O Merge Sort aplica a tecnica de divisao e conquista para a ordenacao [Goo04]. Baseia-se
na juncao de duas seq uencias ordenadas resultando em uma unica, tambem ordenada. A
tecnica da divisao e conquista para ordenar uma seq uencia S de n elementos e dividida
em tres etapas, segundo [Goo04]:
1. Divisao: retornar S caso ela possua um ou zero elemento. Caso contrario, remover
todos os elementos de S, inserindo a primeira metade (n/2) em S
1
e a segunda
metade (n/2) em S
2
;
2. Recursao: ordenar S
1
e S
2
de modo recursivo;
3. Conquista: devolver os elementos para S, realizando um merge entre S
1
e S
2
de
maneira a manter a seq uencia S ordenada.
Abaixo notamos a gura 2.1 que mostra a execucao do algoritmo Merge Sort:
Figura 2.1: Exemplo da execucao do algotirmo Merge Sort.
Detalhando um pouco mais a divisao nota-se que enquanto o n umero de elementos
da seq uencia for maior que um, devem ser criadas duas novas seq uencias, cada uma com
metade dos elementos da seq uencia anterior e o algoritmo de divisao deve ser chamado
recursivamente para essas duas novas seq ueencias.
Ja o processo de juncao deve ser realizado da seguinte maneira: remover, iterativa-
mente, o menor elemento entre S
1
e S
2
e inser-lo na posicao nal de S. Quando uma das
9
seq uencias estiver vazia, todo o restante da outra devera ser movido para o nal de S.
[Goo04] propoe um algoritmo, para esta nalidade, que pode ser encontrado no apendice,
com o nome de juncao.
Podemos destacar algumas caractersticas do Merge Sort:
Eciencia

E uma boa escolha quando a entrada nao cabe totalmente na memoria prin-
cipal, tendo de ser armazenada em dispositivos mais lentos, como um disco rgido,
pois aproveita melhor os dados trazidos em bloco do disco;
Tempo de execucao Nao depende do estado inicial da seq uencia de entrada. Logo,
tanto no melhor quanto no pior e, conseq uentemente no caso medio, o Merge Sort
executa em O(log
2
n), com n igual ao n umero de elementos da entrada.
2.5 Quick Sort
O Quick Sort e um metodo de ordenacao por particionamento e e o mais eciente que se
conhece considerando casos gerais, ou seja, nao-especcos, mas e nao-estavel. Ele tem
como base os algoritmos de ordenacao por permutacoes, como o BubbleSort. Porem sua
estrategia baseia-se na solucao de problemas conhecida como dividir para conquistar, na
qual consiste em escolher um pivo, um elemento qualquer do vetor para ser o elemento que
dividira o vetor em dois segmentos (sub-vetores), sendo estes os problemas menores da
estrategia. Esta divisao e logica, e nao fsica, como acontece com o MergeSort. Apos esta
divisao, efetua-se um processo de separacao dos demais elementos, tendo como parametro
de separacao o valor do elemento escolhido como pivo.
Primeiramente, o vetor e varrido da esquerda para a direita, ate que se encontre um
elemento a > pivo; e tambem da direita para a esquerda a m de encontrar um elemento
b < pivo. Assim, achado os dois elementos a e b, faz-se a troca deles. Este processo
sera realizado mais vezes, a partir de b e a, caso haja necessidade, ate que todos os
elementos `a esquerda do pivo sejam menores ou iguais a ele; e da mesma forma, todos os
elementos `a sua direita sejam maiores ou iguais. Apos esta etapa, o elemento escolhido
como pivo estara na sua posicao correta em relacao `a ordenacao do vetor. No caso de nao
se conseguir escolher algum elemento em um dos segmentos, a troca e feita com o proprio
pivo. Apos esta particao do vetor, realiza-se o processo de recursao para os segmentos.
Estes segmentos serao considerados como sendo vetores originais, assim tambem serao
particionados, gerando seus segmentos, de tamanho cada vez menor. Assim, o processo
de particionamento se repete ate que se obtenha vetores contendo apenas uma posi cao, e
com isso, todos os pivos serao atingidos e como estes estao em suas devidas posicoes, se
10
obtem a ordenacao global.
O Quick Sort apresenta diferentes tempos de ordenacao para os casos medio, mnimo
e maximo, pois dependem da escolha do pivo. Se o pivo for o elemento medio e mediano
(separando a mesma quantidade de elementos maiores e menores do que ele em cada lado)
em toda chamada da recursao, o tempo e mnimo, ou seja, O(n log(n)). Caso o pivo
seja o elemento maior ou menor em cada recursao, o tempo e maximo, ou seja, O(n
2
).
O tempo medio se obtem quando pega o pivo aleatoriamente ou o elemento medio. Isto
e necessario pois, quando o vetor ja estiver ordenado, ao tomar o pivo como sendo o
primeiro elemento, caira no pior caso do algoritmo. Entao e recomendado escolher o pivo
aleatoriamente ou o elemento medio.
Caratersticas:
Ordena vetores ordenados e inversamente ordenados com velocidade praticamente
igual.
Caso medio (pivo aleatorio) e inferior ao caso otimo diferindo apenas por um fator
logartmico de 2 ln(2). Assim, o caso medio possui complexidade de tempo de
ordenacao assintoticamente igual ao seu melhor caso.
Preferencia por vetores maiores e bastante desordenados.
Se escolhendo no vetor o pivo como o elemento central, o caso otimo do Quick Sort
e o vetor inicialmente ordenado.
Considerando caso medio, o Quick Sort e de 2 a 3 vezes mais rapido do que o Heap
Sort (nao-assintotico).
2.6 Heap Sort
O Heap Sort tambem conhecido como metodo de ordenacao por arvores e baseado no
metodo de selecao 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
mnimo, ou o de maior valor, caso seja um heap de maximo.
O Heap e uma estrutura de dados em forma de uma arvore, cuja raiz e o elemento
mnimo ou maximo, dependendo do tipo do heap. Para efetuar a construcao do heap a
partir do vetor de entrada, o tempo gasto e O(n logn), em uma analise mais complexa
este tempo pode ser dado como O(n) [Wir86].
A gura 2.2 apresenta um exemplo de um heap.
Com heap construdo 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 sada.
11
Figura 2.2: Exemplo de um Heap de Maximo
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
construcao do heap e necessario O(n), e mais O(logn) para extrair os elementos do heap
. E o n umero medio de movimentos e de aproximadamente n/2 log(n).
O Heap Sort tem vantagem sobre o Merge Sort, pois nao necessita de memoria auxiliar,
mas uma boa implementacao do Quick Sort e em geral mais rapido [Miy99].
Algumas caractersticas do Heap Sort sao descritas abaixo:
O Heap Sort nao 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 estao par-
cialmente ordenados na ordem inversa, dando uma caracterstica nao-natural ao
algoritmo;
Se o vetor de entrada estiver na ordem inversa, o processo de construcao do heap
leva zero movimentos para ser realizado.
2.7 Count Sort
Tambem conhecido como Counting Sort, e um metodo de ordenacao linear, isto e, tem
complexidade O(n). Ele nao se baseia em comparacoes, e sim em indexacao. Para isso,
12
os valores a serem ordenados devem ser inteiros, pois estes serao usados como chaves no
vetor auxiliar por ele requisitado (repare que ele precisa de memoria extra para trabalho,
porem nao e recursivo). Assim, este algoritmo nao funciona com entradas em ponto
utuante, pois se usasse uma lista encadeada, seu desempenho possivelmente nao seria
satisfatorio, 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 ate k. Importante observar
que O(k) deve ser linear para que o algoritmo tambem o seja, o que acontece na pratica.
O algoritmo e formado por quatro lacos de repeticao que varrem ou o vetor original ou
o de trabalho. Primeiramente ele cria o vetor de trabalho e atribui zero a todas posicoes,
consumindo O(k). Depois varre o vetor original e incrementa as quantidades dos elementos
da entrada no vetor de trabalho utilizando a indexacao. Assim, o tempo gasto e de apenas
O(n) pois a indexacao 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 posicao. Para isso,
ele faz a soma do valor de uma posicao com a anterior, comecando pela segunda e indo
ate a ultima. Este laco leva O(k). Por ultimo, cursa o vetor de entrada ao contrario, para
assim garantir estabilidade. Essa propriedade e importante quando se trabalha com outros
dados junto ao elemento que sofrera ordenacao, mas para isso sera necessario outro vetor
auxiliar, o vetor de sada. Este vetor, logicamente tera o mesmo tamanho da entrada, e
sera preenchido da seguinte forma: o elemento de entrada sera colocado na posicao de
sada indicada pelo seu proprio valor no vetor de trabalho. Logo em seguida, decrementa-
se o valor da contagem do vetor de trabalho na posicao utilizada, para que, quando ocorra
repeticao de elementos na entrada, estes nao ocupem o mesmo lugar no vetor de sada.
Esta etapa tambem e O(n), e no total temos O(k)+O(n)+O(k)+O(n) = O(n), adotando
que O(k) e linear.
Finalmente, nao e recomendado usar este algoritmo quando se tem um valor muito
grande de k, pois precisaria de muita memoria e em muitos casos sem necessidade. Por
outro lado, e bom utiliza-lo quando a comparacao dos elementos representar um problema,
pois este metodo usa operacoes aritmeticas e atribuicoes para fazer a ordenacao ao inves
de comparacoes.
2.8 Bucket Sort
Algoritmo baseado na ideia 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 posicao de B e uma lista de itens. Por exemplo, o elemento f sera
armazenado em B[f].
13
O Bucket Sort funciona da seguinte maneira: seja S a seq uencia 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 uencia S e das seq uencias B[i].
O Bucket Sort possui tempo de execucao O(n + N) onde n representa a quantidade de
elementos na sequ uencia S. Apresenta bom desempenho quando N e pequeno se compa-
rado com n.
No melhor caso, espera-se que cada elemento de S seja armazenado em um Bucket dife-
rente e, em contrapartida, em seu pior caso, todos os elementos da seq uencia sao arma-
zenados no mesmo Bucket.
2.9 Radix Sort
O Radix Sort e um algoritmo baseado no conceito de ordenacao 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 sao inseridos contadores, incrementado-
os se os mesmos forem correspondentes a chave de valor i, apos realizado este processo,
e conhecido a quantidade de posicoes necessarias para cada valor de chave, assim os
elementos sao transferidos para as posicoes corretas no novo vetor ordenado[Ric03].
O Radix Sort utiliza o conceito de ordenacao por contagem, porem ele realiza a con-
tagem com apenas uma parte da representacao do elemento, a qual e denominada raiz.
O processo de contagem e realizado com esta parte varias vezes ate que a representacao
total do elemento seja analisada.
Duas classicacoes podem ser realizadas com o radix sort, LSD (Least Signicant
Bits) e MSD (Most Signicant Bits), que dene a ordem que serao 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 especicacao do radix sort apresentada acima e possvel perceber que este al-
goritmo pode ser aplicado a ordenacao de strings como um vetor de entrada [bg, bd, a, fk, fj, e]
sendo ordenado como [a, bd, bg, e, fj, fk]. Este algoritmo e muito utilizado para ordenacao
lexicograca.
Para ordenacao de n umeros inteiros o radix sort pode trabalhar uma maneira simples,
como a parte do elemento sendo um dgito do elemento, assim a ordenacao pode ser feita
ordenando os dgitos 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 or-
14
denacao pelo dgito menos signicativo, temos algo como mostrado na gura 2.3
Figura 2.3: Vetor ordenado pelo dgito menos signicativo
Apos isto, realiza-se a ordenacao dos proximos dgitos, como neste caso os valores
sao no maximo de dois dgitos, entao na ordenacao do proximo dgito o vetor ja estara
ordenado, como e mostrado na gura 2.4.
Figura 2.4: Vetor ordenado
Uma desvantagem do Radix Sort e a necessidade de um espaco de memoria auxiliar
de tamanho N, que e o tamanho do alfabeto dos elementos de entrada. Se a quantidade
de memoria 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 entao de complexidade temporal linear O(n).
15
Captulo 3
Conclusao
Apresentamos, neste trabalho, alguns dos principais algoritmos de ordenacao. Mostramos
as caractersticas de cada um, analisando o tempo computacional no melhor, pior e medio
casos.
Atraves deste estudo, pode-se concluir que nao existe um algoritmo de ordenacao
que seja eciente para todos os casos, ja que para cada situacao existe um algoritmo
que melhor a solucione. Um exemplo mostrado foi o caso do Merge Sort que funciona
melhor em situacoes onde a entrada nao cabe toda na memoria 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 rapidos quando a entrada esta toda em memoria.
Podem ser realizadas pequenas modicacoes nos algoritmos originais, a m de garan-
tir caractersticas extras, como no caso do Bucket Sort, onde a estabilidade e garantida
atraves da remocao do primeiro elemento de cada seq uencia.
16
Apendice A
Pseudo-Codigo do Algoritmo de ordenacao Bubble Sort
Algoritmo segundo [Wir86]:
BubbleSort(vetor A,n)
1. para i 0 ate n faca
2. para j n - 1 decrescendo ate j = i faca
3. se A[j] < A[j - 1] entao
4. Troque(A[j] , A[j - 1]);
5. m se
6. m para
7. m para
m do algoritmo
Pseudo-Codigo do Algoritmo de ordenacao Insertion
Sort
Algoritmo segundo [Miy99]:
InsertionSort(Vetor V , Inteiro n)
1. j 2
2. enquanto j n faca
3. AUX V [j];
4. i j 1;
5. enquanto i > 0 e V [i] > AUX faca
6. V [i + 1] V [i];
7. j j 1;
8. m enquanto
9. V [i + 1] AUX;
10. j j + 1;
11. m enquanto
m do algoritmo
17
Pseudo-Codigo do Algoritmo de ordenacao Selection
Sort
Algoritmo segundo [Wir86]:
SelectionSort(A,tam)
1. para i 1 ate tam faca
2. min i;
3. para j i + 1 ate tam faca
4. se A[min] > A[j]
5. min j;
6. m se
7. m para
8. se i = min
9. A[min] A[i];
10 m se
11. m para
m do algoritmo
Pseudo-Codigo do Algoritmo de ordenacao Merge Sort
Algoritmo segundo [Miy99]:
MergeSort(Vetor V, inicio, fim)
1. se inicio < fim entao
2. meio
inicio+fim
2

3. MergeSort(V , inicio, meio);
4. MergeSort(V , meio + 1, fim);
5. Juncao(V [inicio..meio], V [meio + 1..fim], V );
6. m se
m do algoritmo
Metodo auxiliar do Merge Sort
Juncao(S
1
,S
2
, S):
% Entrada sequencia S
1
e S
2
ordenadas de forma nao-decrescente e uma sequencia S vazia.
% Saida sequencia S contendo os elementos de S
1
e S
2
ordenados de
forma nao-decrescente com as sequencias S
1
e S
2
tornando-se vazias
18
1. enquanto S
1
ou S
2
nao forem vazias faca
2. se S
1
.rstElement() S
2
.rstElement() entao
3. {remova o primeiro elemento de S
1
para o nal de S}
4. S.insertLast(S
1
.removeFirst())
5. senao
6. {remova o primeiro elemento de S
2
para o nal de S}
7. S.insertLast(S
2
.removeFirst())
8. {remova os elementos restantes de S
1
para S}
9. enquanto(naoS
1
.isEmpty()) faca
10. S.insertLast(S
1
.removeFirst())
11. {remova os elementos restantes de S
2
para S}
12. enquanto(naoS
2
.isEmpty()) faca
13. S.insertLast(S
2
.removeFirst())
m do algoritmo
Pseudo-Codigo do Algoritmo de ordenacao Quick Sort
Algoritmo segundo [Miy99]:
QuickSort(vetor V, inicio, m)
1. se inicio < m entao
2. meio Particiona( V, inicio, m )
3. QuickSort( V, inicio, meio -1 );
4. QuickSort( V, meio + 1, m );
5. m se
m algoritmo
Metodo auxiliar do Quick Sort
Particiona(vetor V, inicio, m)
1. Pivo V[inicio];
2. ESQ inicio + 1;
3. DIR m;
4. enquanto ESQ < DIR faca
5. enquanto V[ESQ] Pivo e ESQ m faca ESQ ESQ + 1;
6. enquanto V[DIR] > Pivo e DIR inicio faca DIR DIR - 1;
7. se ESQ < DIR entao Troque(V[ESQ], V[DIR]);
8. m enquanto
9. MEIO DIR;
19
10. Troque(V[inicio, V[MEIO]]);
11. Retorne MEIO;
m do algoritmo
Pseudo-Codigo do algoritmo de Ordenacao Heap Sort
Algoritmo segundo [Miy99]:
HeapSort(A,i)
1. ConstroiHeap(A,i);
2. para i n decrescendo ate 1 faca
3. A[i] ExtraiMax(A,i);
m do algoritmo
Metodos auxiliares do Heap Sort
ConstroiHeap(A,n)
1. para i [
n
2
] decrescendo ate 1 faca
2. Rebaixa(A,n,i);
m do algoritmo
Rebaixa(A,n,i)
1. pai i;
2. fesq FilhoEsq(i);
3. fdir FilhoDir(i);
4. maior pai;
5. se fesq n e A[fesq] > A[pai]
6. entao maior fesq;
7. se fdir n e A[fdir] > A[maior]
8. entao maior fdir;
9. se maior = pai entao
10. Troca(A[maior], A[pai]);
11. Rebaixa(A,n,maior);
m do algoritmo
ExtraiMax(A,n,i)
1. se n < 1 erro;
2. max A[1];
3. A[1] A[n];
4. n n - 1;
20
5. Rebaixa(A,n,1);
6. retorne max;
m do algoritmo
Pseudo-Codigo do Algoritmo de ordenacao Count Sort
Algoritmo segundo [Miy99]:
CountSort(A,B,n,k)
1. para i 1 ate k faca
2. C[i] 1; % inicializa contadores com 0
3. para j 1 ate n faca
4. C[A[i]] C[A[i]] +1;
5. para i 2 ate k faca
6. C[i] C[i] + C[i - 1];
7. para j n decrescendo ate 1 faca
8. B[C[A[j]]] A[j];
9. C[A[j]] C[A[j]] - 1;
m do algoritmo
Pseudo-Codigo do Algoritmo de ordenacao Bucket Sort
Algoritmo segundo [Miy99]:
BucketSort(S)
1. Entrada: seq uencia S de itens com chaves inteiras no intervalo [0, N 1]
2. Saida: seq uencia S ordenada pelas chaves, de forma nao-decrescente
3. seja B um arranjo de N seq uencias, cada uma inicalmente vazia
4. para cada item x em S faca
5. seja k a chave de x
6. remove x de S e o insere no m da seq uencia B[k]
7. m para
8. para i 0 ate N 1 faca
9. para cada item x da seq uencia B[i] faca
10. remove x de B[i] e o insere no m de S
11. m para
12. m para
m do algoritmo
21
Pseudo-Codigo do Algoritmo de Ordenacao Radix Sort
Algoritmo segundo [Miy99]:
RadixSort(A,n,d)
1. para i 1 ate d faca
2. Use um algoritmo estavel para ordenar o array A no digito i.
m do algoritmo
22
Referencias Bibliogracas
[Goo04] Michael T. Goodrich. Projeto de algoritmos: Fundamentos, analise 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. Ordenacao por contagem. Disponvel 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

Você também pode gostar