You are on page 1of 29

Algoritmos de Ordenação

No nosso dia-a-dia, com freqüência, nos ocorre de termos de


procurar dados em listas ou tabelas. Quando estes dados nos são
apresentados de forma desordenada, nosso trabalho é muito mais
difícil do que se eles estivessem previamente classificados ou
ordenados. Por isso, estudaremos os principais algoritmos para
ordenação ou classificação de dados.
Algoritmos de Ordenação
1. Ordenação por Seleção
2. Ordenação por Inserção
3. Ordenação por troça
a. Método da Bolha (Bubble Sort)
b. Método de Divisão e Troca (Quick Sort)
ORDENAÇÃO INTERNA

MÉTODOS SIMPLES OU DIRETOS


Algoritmos de Ordenação
1.Ordenação por Seleção
O método da ordenação por seleção consiste em ordenar os
elementos de uma lista seguindo-se os seguintes passos:
Escolhe-se o menor elemento do vetor e troca-se com o primeiro
elemento. Dos elementos restantes, seleciona-se o de mais baixo
valor e troca-se com o segundo. E assim por diante, até que o vetor
esteja todo ordenado.
Este algoritmo somente deve ser utilizado para classificar listas
pequenas, pois é muito ineficiente.
Ordenação por Seleção Direta
1 2 3 4 5 6

Chaves Iniciais O R D E N A
i=1 A R D E N O

i=2 A D R E N O

i=3 A D E R N O

i=4 A D E N R O

i=5 A D E N O R
Algoritmos de Ordenação
VARIÁVEIS
Vetor : VETOR[0..10] DE INTEIRO
i : INTEIRO
PROCEDIMENTO SELECAO (vetor:VETOR DE INTEIRO, tamanho: INTEIRO)
VARIÁVEIS
i, j, menor : INTEIRO
x : elemento da lista
INÍCIO
PARA i DE 1 ATÉ tamanho-1 FAÇA
menor  i
PARA j DE i+1 ATÉ TAMANHO FAÇA
SE vetor [j] < vetor [menor] FAÇA
menor  j
FIMPARA
x  vetor [menor]
vetor [menor]  vetor [i]
vetor [i]  x
FIMPARA
FIM
Algoritmos de Ordenação
INÍCIO
PARA i DE 1 ATÉ 10 FAÇA
LEIA vetor [i]
FIMPARA

SELECAO (vetor, 10)

PARA i DE 1 ATÉ 10 FAÇA


ESCREVA vetor [i]
FIMPARA
FIM
Algoritmos de Ordenação
1.Ordenação por Inserção
Inicialmente, considara-se o primeiro elemento ordenado. O
segundo elemento é, então, inserido na sua posição correta em
relação ao primeiro, resultando as duas primeiras posições
ordenadas. A seguir, o terceiro elemento é inserido na sua posição
correta em relação aos dois primeiros, resultando nas três primeiras
posições ordenadas. E assim sucessivamente. Ao inserir cada novo
elemento, deslocamentos são feitos, se necessários.
Obs: O tempo de execução desse método cresce exponencialmente
em relação ao tamanho da tabela. Todavia, tem comportamento
natural, isto é, é bom para listas quase ordenadas.
Ordenação por Inserção
1 2 3 4 5 6

Chaves Iniciais O R D E N A
i=2 O R D E N A

i=3 D
O O R E N O
A
i=4 D E O R N A

i=5 D E N O R A

i=6 A D E N O R
Algoritmos de Ordenação
VARIÁVEIS
Vetor : VETOR[1..10] DE INTEIRO
i, j, chave : INTEIRO
INÍCIO
PARA i DE 1 ATÉ 10 FAÇA
LEIA vetor [i]
FIMPARA
PARA j DE 2 ATÉ 10 FAÇA
chave  vetor [j]
i j-1
ENQUANTO ( i > 0 ) E (vetor[i] > chave ) FAÇA
vetor [i + 1]  vetor [i]
i i-1
FIMENQUANTO
VETOR [i + 1]  chave
FIMPARA
FIM
Algoritmo da bolha - Bubble Sort
• Idéia básica
– Troca pares de elementos adjacentes que estão fora
de ordem
– Faz múltiplas passagens pelo array até que as trocas
não sejam mais necessárias
– Invariante
•A cada passagem coloca o maior elemento na posição
correta, a última posição para aquela passagem
Obs: Esse método é um dos mais conhecidos e simples,
mas um dos piores.
Algoritmo da bolha: execução
12 8 3 21 99 1 início

8 12 3 21 99 1 Compara, troca (1, 2)

8 3 12 21 99 1 Compara, troca (2, 3)

8 3 12 21 99 1 Compara, não troca

8 3 12 21 99 1 Compara, não troca

8 3 12 21 1 99 Compara, troca (5, 6)

8 3 12 21 1 99 maior na posição final


Algoritmo da bolha: execução (cont.)
8 3 12 21 1 99 Passo 2

3 8 12 21 1 99 troca (1, 2)

3 8 12 21 1 99 não troca

3 8 12 21 1 99 não troca

3 8 12 1 21 99 troca (4, 5)

3 8 12 1 21 99 21 na posição
Algoritmo da bolha: execução (cont.)
3 8 12 1 21 99 Passo 3

3 8 12 1 21 99 não troca

3 8 12 1 21 99 não troca

3 8 1 12 21 99 troca (3, 4)

3 8 1 12 21 99 12 na posição; passo 4

3 8 1 12 21 99 não troca

3 1 8 12 21 99 troca (2, 3)

3 1 8 12 21 99 8 na posição; passo 5

1 3 8 12 21 99 troca (1, 2)

1 3 8 12 21 99 FEITO
Algoritmos de Ordenação
VARIÁVEIS
Vetor : VETOR[1..10] DE INTEIRO
i : INTEIRO
PROCEDIMENTO bublesort (vetor:VETORDE INTEIRO, tamanho: INTEIRO)
VARIÁVEIS
i, j, temp : INTEIRO
INÍCIO
PARA i DE 1 ATÉ tamanho FAÇA
PARA j DE 1 ATÉ TAMANHO-1 FAÇA
SE vetor [j] > vetor [j+1] FAÇA
temp  vetor [j]
vetor [J]  vetor [j+1]
vetor [j+1]  temp
FIMSE
FIMPARA
FIMPARA
FIM
Algoritmos de Ordenação
INÍCIO
PARA i DE 1 ATÉ 10 FAÇA
LEIA vetor [i]
FIMPARA

bublesort (vetor, 10)

PARA i DE 1 ATÉ 10 FAÇA


ESCREVA vetor [i]
FIMPARA
FIM
Algoritmo da bolha: uso
• quando se dispõe de uma quantidade de tempo
enorme...
– em situações reais, é duas vezes mais lento do que
os algoritmos de inserção direta e seleção direta
– última escolha...
ORDENAÇÃO INTERNA

MÉTODOS SOFISTICADOS OU
EFICIENTES
Ordenação por Particionamento ou Quicksort
• O Quicksort é o algoritmo mais rápido para ordenação interna já
conhecido, sendo por isso o mais utilizado entre todos os algoritmos
de ordenação para uma grande quantidade de situações.
• Princípio
1. Dividir o problema de ordenar um conjunto de n itens
em dois problemas menores
2. Ordenar independentemente os problemas menores
3. Combinar os resultados para produzir a solução do
problema maior
Partição

• O procedimento de partição é uma parte


complicada do método:
– Deve-se rearranjar o vetor na forma A[Esq..Dir]
através da escolha arbitrária de um item x do vetor
chamado pivô
– Ao final, o vetor A deverá ter duas partes, uma
esquerda com chaves menores ou iguais que x e a
direita com valores de chaves maiores ou iguais que x
Algoritmo Quicksort: Partição
1. Escolher arbitrariamente um item do vetor e colocar
este valor em x
2. Percorrer o vetor a partir da esquerda até que um item
A[i]  x é encontrado; da mesma maneira, percorrer o
vetor a partir da direita até que um item A[j]  x é
encontrado;
3. Como os itens A[i] e A[j] não estão na ordem correta
no vetor final, eles devem ser trocados
4. Continuar o processo até que os índice i e j se cruzem
em algum ponto do vetor
Funcionamento do Quicksort: Partição

• Ao final do processo, o vetor A[Esq..Dir] está


particionado de tal forma que:
– Os itens em A[Esq], A[Esq+1],..., A[j] são menores
ou iguais a x
– Os itens em A[i], A[i+1],..., A[Dir] são maiores ou
iguais a x
Exemplo de Partição
1 2 3 4 5 6

Chaves Iniciais O R D E N A
i=2 A R D E N O
i=3 A D R E N O

• O pivô é escolhido como sendo A[(i+j) div 2]


• Inicialmente, i=1 e j=6, e então x=A[3] = D
• A varredura a partir da posição 1 pára no item O e a varredura
a partir da posição 6 pára em A, sendo os dois itens trocados
• A varredura a partir da posição 2 pára em R e a varredura a
partir da posição 5 pára no item D, e então os dois itens são
trocados
• Neste instante i e j se cruzam (i=3 e j=2), o que encerra o processo
de partição
Procedimento Ordena
1 2 3 4 5 6

Chaves Iniciais O R D E N A
i=1 A D R E N O

i=2 A D

i=3 E R N O

i=4 N R O

i=5 O R

i=6 A D E N O R
Procedimento Partição
VARIÁVEIS
vetor : VETOR[0...10] DE INTEIRO
i : INTEIRO
 
PROCEDIMENTO quicksort(variavel vetor : VETOR DE INTEIRO, primeiro :
INTEIRO, último : INTEIRO)
VARIÁVEIS
menor : INTEIRO
maior : INTEIRO
separador : INTEIRO
temp : INTEIRO
 
INÍCIO
menor  primeiro
maior  último
separador  vetor[(primeiro + último) / 2]
Procedimento Partição
REPITA
ENQUANTO vetor[menor] < separador FAÇA
menor  menor + 1
FIMENQUANTO
ENQUANTO vetor[maior] > separador FAÇA
maior  maior - 1
FIMENQUANTO
 
SE menor <= maior FAÇA
temp  vetor[menor]
vetor[menor]  vetor[maior]
vetor[maior]  temp
 
menor  menor + 1
maior  maior - 1
FIMSE
ATÉ QUE menor > maior
Procedimento Partição
SE primeiro < maior FAÇA
quicksort(vetor, primeiro, maior)
FIMSE
SE menor < último FAÇA
quicksort(vetor, menor, último)
FIMSE
FIM
INÍCIO {Programa Principal}
PARA i DE 1 ATÉ 10 FAÇA
LEIA vetor[i]
FIMPARA
 
quicksort(vetor, 1, 10)
 
PARA i DE 1 ATÉ 10 FAÇA
ESCREVA vetor[i]
FIMPARA
FIM 
Analisando a procedure
• O vetor é uma variável global ao procedimento
Partição
• Obs: note que o laço interno do algoritmo de
partição só faz incrementos e decrementos; daí
a velocidade do algoritmo
Referências
• Transparências disponibilizadas pelo Prof.
Ziviani, a partir do Livro Projeto de Algoritmos
com Implementação em Pascal e C, M. A. da
Silva Bigonha e Nívio Ziviani, Campus
• Algoritmos e Estruturas de Dados, N. Wirth,
Prentice-Hall
• Curso on-line Estrutura de Dados I, USP – São
Carlos

You might also like