Escolar Documentos
Profissional Documentos
Cultura Documentos
Algoritmos de Ordenação
T1530A, T7043A
Sumário
III.1. Introdução ........................................................................................................... 3
III.2. Ordenação por troca ........................................................................................... 4
III.2.1. Método da Bolha ( bubblesort) .................................................................... 4
III.2.2. Ordenação por troca de partição (QuickSort)............................................... 7
III.3. Ordenação por seleção..................................................................................... 10
III.3.1. Seleção direta............................................................................................. 11
III.4. Ordenação por inserção.................................................................................... 13
III.4.1. Inserção simples......................................................................................... 13
III.4.2. Ordenação de Shell (shellsort) ................................................................... 15
III.5. Ordenação em Árvore....................................................................................... 18
III.5.1. Ordenação por heapsort............................................................................. 18
III.6. Uma comparação superficial dos algoritmos de ordenação.............................. 23
III.7. Comentários Adicionais .................................................................................... 24
III.8. Bibliografia ........................................................................................................ 25
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
III.1. INTRODUÇÃO
Tempo - desempenho
Perguntas a fazer:
• Vale a pena investir num algoritmo de ordenação muito eficiente? Se não, é
importante saber justificar o porque!
página 3
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Exemplos:
• Bolha
– Classificação por troca:
• Quicksort - classifica ção por troca de partição
• Binária
- Classificação em árvore:
• Heapsort
•Inserção simples
- Classificação por inserção: •Shell
•Cálculo de endereço
Algoritmo básico:
página 4
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Pseudocódigo:
constante
MAXIMO = 100 % pode ser um dado fornecido a uma rotina
variáveis
vetor[1... MAXIMO]: inteiro
j, i, trab, limite: inteiro
troca: lógico
inicio
para i ← 1 até MAXIMO faça
leia (vetor[i])
fim para
troca ← true;
limite ← MAXIMO – 1
enquanto (troca = true) faça
inicio
troca ← false
para i ← até limite faça
inicio
se vetor[i] > vetor [i + 1] então
trab ← vetor[i]
vetor[i] ← vetor[i + 1]
vetor[i + 1] ← trab
j← i
troca ← true
fim se
fim para
limite ← j
fim enquanto
fim
Exemplo:
25 57 48 37 12 92 86 33
1o 25 48 37 12 57 86 33 92 // maior valor está no final da seqüência
passo
2o. 25 37 12 48 57 33 86 92 // 2o. maior valor já está na posição
passo correta
3o. 25 12 37 48 33 57 86 92
passo
página 5
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
4o. 12 25 37 33 48 57 86 92
passo
5o. 12 25 33 37 48 27 86 92
passo
6o. Sem trocas
passo
64 4 4 k4termos
74 4 4 4 8
(N - 1) + (N + 2) + (N - 3) + ... + (N - k) = kN (1 + 2 + 3 + ... + (k - 1) + k)
k
= kN - (k + 1)
2
(2kN - k 2 - k)
=
2
O número médio de iterações k depende de N, de sorte que k é O(N). Portanto, esta
modificação resulta em um algoritmo O(N2) também. O efeito das modificações é
reduzir o fator multiplicativo da definição de ordem O.
página 6
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Algoritmo:
a) Pivô é escolhido no meio do vetor. O elemento é colocado numa variável
auxiliar trab;
b) São iniciados dois ponteiros i e j;
c) O vetor é percorrido a partir da esquerda até que se encontre um V[i] ≥ trab (i
é incrementado no processo);
d) O vetor é percorrido a partir da direita até que se encontre um V[j] ≤ trab (j é
decrementado no processo);
e) Os valores V[i] e V[j] são trocado; i é incrementado de 1 e j é decrementado
de 1;
f) O processo é repetido até que i e j se cruzem em algum ponto do vetor;
g) Quando são obtidos os dois segmentos do vetor por meio do processo de
partição, realiza-se a ordenação de cada um deles de forma recursiva.
página 7
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Pseudocódigo:
Função QuickSort (V[ ] : Vetor de inteiro, esquerda, direita : inteiro)
Inicio
variáveis
trab, aux : inteiro
i, j : inteiro
i ← esquerda
j ← direita
trab ← V[(esquerda + direita) div 2]
repita
enquanto trab > V[i] faça
P
inicio
i ← i + 1;
A
fim enquanto
R
enquanto trab < V[j] faça
inicio
T
j ← j - 1;
fim enquanto I
se i ≤ j então Ç
inicio
aux ← V[i] Ã
V[i] ← V[j]
V[j] ← aux O
i ← i+1
j ← j–1
fim se
até i > j
fim
página 8
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Exemplo:
V[ ] 25 57 48 37 12 92 86 33 esquerda = 1; direita = 8,
trab = V[4] = 37,
1o passo 25 33 12 37 48 92 86 57 Resultado obtido após a primeira
ordenação em torno do pivô
Partição 1 25 33 12 esquerda = 1, direita = 3, trab =
vetor da V[(1+3)/2] = V[2] = 33
esquerda
25 12 33 Resultado obtido após a reordenação
do vetor da direita (primeira partição)
Partição 2 25 12 esquerda = 1, direita = 2,
Vetor da trab = V[(1+2)/2] = V[1] = 25
esquerda
12 25
Partição 2 33 O processo recursivo é interrompido.
Vetor da
direita
Vetor da 12 25 33
Esquerda
reordenado
Partição 1 48 92 86 57 esquerda = 5, direita = 8
vetor da trab = V[(5+8)/2] = V[6] = 92
direita
48 57 86 92 Resultado obtido após a reordenação
do vetor da direita (primeira partição)
Partição 2 48 57 86 esquerda = 5, direita = 7
Vetor da trab = V[(5+7)/2] = V[6] = 57
direita
48 57 86 processo recursivo é interrompido
Vetor da 48 57 86 92
Direita
reordenado
Vetor 12 25 33 37 48 57 86 92
original
ordenado
página 9
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Para simplificar ainda mais a análise, vamos assumir que o pivô está sempre no
meio exato do subvetor.
64 4 4 4 4 4 4 4 4m termos 74 4 4 4 4 4 4 4 4 8
n + 2 * (n / 2) + 4 * (n / 4) + 8 * (n / 8) + ... + n * (n / n ) = n * m
página 10
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Pseudo-código
constante:
TAMANHO = 15
variáveis:
vetor[1...TAMANHO]: inteiro
i, j, trab, menor: inteiro
início
para i ← 1 até TAMANHO faça
leia (vetor[i])
fim para
para i ← 1 até TAMANHO-1 faça
menor ← i
para j ← i + 1 até TAMANHO faça
se vetor[j] < vetor[menor] então
menor ← j
fim se
fim para
trab ← vetor[i]
vetor[i] ← vetor[menor]
vetor[menor] ← trab
fim para
fim
página 11
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Exemplo:
25 57 48 37 12 92 86 33
1o passo 25 57 48 37 12 92 86 33 // identifica menor valor do
segmento (segmento na cor cinza)
12 57 48 37 25 92 86 33 // troca-se a posição com o primeiro
elemento do segmento
2o. passo 12 57 48 37 25 92 86 33 // identifica menor valor do
segmento (tamanho do segmento
diminuiu de uma posição)
12 25 48 37 57 92 86 33
3o. passo 12 25 48 37 57 92 86 33
12 25 33 37 57 92 86 48
4o. passo 12 25 33 37 57 92 86 48
12 25 33 37 57 92 86 48
5o. passo 12 25 33 37 57 92 86 48
12 25 33 37 48 92 86 57
5o. passo 12 25 33 37 48 92 86 57
12 25 33 37 48 57 86 92
6o. passo 12 25 33 37 48 57 86 92
12 25 33 37 48 57 86 92
7o. passo 12 25 33 37 48 57 86 92 //fim do processo
n * (n − 1)
(n − 1)+ (n − 2)+ (n − 3)+ ..... + 3 + 2 + 1 = .
2
Isto significa que a ordenação por seleção direta é O(n2). Esta é a mesma ordem do
algoritmo apresentado para o método da bolha, contudo, o tempo de execução do
método de seleção direta é menor.
página 12
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Algoritmo
O algoritmo pode ser resumido da seguinte maneira:
Pseudocódigo
página 13
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Exemplo
25 57 48 37 12 92 86 33
1o passo 25 57 48 37 12 92 86 33 // separa o primeiro valor – A região
cinza corresponde ao vetor não
ordenado. O número em negrito
será incluído no primeiro segmento
já na posição correta.
2o. passo 25 57 48 37 12 92 86 33
3o. passo 25 48 57 37 12 92 86 33
4o. passo 25 37 48 57 12 92 86 33
5o. passo 12 25 37 48 57 92 86 33
5o. passo 12 25 37 48 57 92 86 33
6o. passo 12 25 37 48 57 86 92 33
7o. passo 12 25 33 37 48 57 86 92 //fim do processo
n * (n − 1)
(n − 1)+ (n − 2)+ (n − 3)+ ..... + 3 + 2 + 1 = ,
2
ou seja, é O(n2).
Este método é, em geral, melhor que o método da bolha. Quanto mais ordenado
estiver o vetor inicial, mais eficiente será a ordenação por inserção simples.
página 14
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Pseudocódigo
Função shellsort (V[ ] : Vetor de inteiro, maximo: inteiro, h[ ] : vetor de inteiro, m : inteiro)
inicio
i, j, k, trab: inteiro
fim para
fim
página 15
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
25 57 48 37 12 92 86 33
o
1 passo 25 57 48 37 12 92 86 33 h = 4
foram comparadas as posições 1 com 5
(trocados 25 e 12), 2 com 6 (sem
trocas), 3 com 7 (sem trocas) e 4 com 8
(trocados 37 com 33).
2o. passo 12 57 48 33 25 92 86 37 h = 3
foram comparadas as posições 1 com 4,
com 7 (sem trocas), 2 com 5 com 8 (2
trocas) e 3 com 6 (sem trocas)
3o. passo 12 25 48 33 37 92 86 57 h = 1
A partir deste ponto o procedimento se
reduz ao da ordenação por inserção
simples
4o. passo 12 25 33 37 48 57 86 92 resultado final.
25 57 48 37 12 92 86 33
o
1 passo 25 57 48 37 12 92 86 33 h = 3
foram comparadas as posições 1 com 4,
com 7 (sem trocas), 2 com 5 com 8 (2
trocas) e 3 com 6 (sem trocas)
2o. passo 25 12 48 37 33 92 86 57 h = 2
posições comparadas : 1,3,5,7 (1 troca)
posições comparadas : 2,4,6,8 (1troca)
3o. passo 25 12 33 37 48 57 86 92 h = 1
A partir deste ponto o procedimento se
reduz ao da ordenação por inserção
simples
4o. passo 12 25 33 37 48 57 86 92 resultado final.
página 16
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
25 57 48 37 12 92 86 33
o
1 passo 25 57 48 37 12 92 86 33 h = 3
foram comparadas as posições 1 com 4,
com 7 (sem trocas), 2 com 5 com 8 (2
trocas) e 3 com 6 (sem trocas)
2o. passo 25 12 48 37 33 92 86 57 h = 1
• Foi possível estabelecer que o shellsort nunca executa mais do que N1,5
comparações para incrementos na seqüência (inversa) {1,4,13,40,121, ...}.
• Existem algumas seqüências de incrementos que provavelmente resultam em
desempenhos ruins (só para citar uma : { 1,2,4,8,16,32,64,....}. Nestas
condições elementos em posições impares não são comparados com
elementos em posições pares até que h seja 1.
página 17
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Pseudocódigo
variáveis:
i,k,n1,ch,ed: inteiro
Inicio
rem ordenação
para n1 de n-1 até 1 faça
inicio
ch ← c[1]; c[1] ← c[n1 +1]; c[n1+1] ← ch;
ed ← e[1]; e[1] ← e[n1 +1]; e[n1+1] ← ed;
execute insereheap (c, e, n, 1, n1)
fim para
fim heapsort
página 18
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
inicio
i ← k; troca ← true
enquanto troca faça
se valor(c, n1,2*i) > valor (c, n1, 2*i + 1) então
h ← 2*i
senão h ← 2*i + 1
fim enquanto
fim insereheap
Exemplo:
posição no vetor 1 2 3 4 5 6 7 8
valor 25 57 48 37 12 92 86 33
página 19
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
25 1 25 1
2 3 2 3
57 48 57 92
4 5 6 7 4 5 6 7
37 12 92 86 37 12 48 86
33 8 33 8
valor 25 57 48 37 12 92 86 33 valor 25 57 92 37 12 48 86 33
92 1 92 1
2 3 2 3
57 25 57 86
4 5 6 7 4 5 6 7
37 12 48 86 37 12 48 25
33 8 33 8
Classificação
92 1 33 1
2 3 2 3
57 86 57 86
4 5 6 7 4 5 6 7
37 12 48 25 37 12 48 25
33 8 92 8
86 1 86 1
2 3 2 3
57 33 57 48
4 5 6 7 4 5 6 7
37 12 48 25 37 12 33 25
92 8 92 8
página 20
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
25 1 57 1
2 3 2 3
57 48 25 48
4 5 6 7 4 5 6 7
37 12 33 86 37 12 33 86
92 8 92 8
57 1 33 1
2 3 2 3
37 48 37 48
4 5 6 7 4 5 6 7
25 12 33 86 25 12 57 86
92 8 92 8
48 1 12 1
2 3 2 3
37 33 37 33
4 5 6 7 4 5 6 7
25 12 57 86 25 48 57 86
92 8 92 8
37 1 37 1
2 3 2 3
12 33 25 33
4 5 6 7 4 5 6 7
25 48 57 86 12 48 57 86
92 8 92 8
página 21
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
12 1 33 1
2 3 2 3
25 33 25 12
4 5 6 7 4 5 6 7
37 48 57 86 37 48 57 86
92 8 92 8
12 1 25 1
2 3 2 3
25 33 12 33
4 5 6 7 4 5 6 7
37 48 57 86 37 48 57 86
92 8 92 8
12 1
2 3
Ao final do processo, o vetor estará
ordenado:
25 33
4 5 6 7
37 48 57 86 posição 1 2 3 4 5 6 7 8
valor 12 25 33 37 48 57 86 92
92 8
Fim do processo
Desempenho
Este método não utiliza memória adicional para realizar a ordenação de um vetor.
Além disso, o Heapsort ordena N elementos em N log N passos, independente da
entrada de dados. Portanto, o heapsort é O(N log (N)).
página 22
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
página 23
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
Os dados das tabelas foram normalizados para o algoritmo que apresenta o melhor
desempenho no teste. Observem também que o desempenho relativo dos vários
algoritmos varia muito, dependendo da organização dos dados de entrada.
Contudo, os conceitos discutidos até o momento, no que diz respeito à análise dos
algoritmos, continuam válidos. O que muda é o fator multiplicativo (não explicitado
na notação de ordem – consulte novamente a definição de ordem Omicron
apresentada na apostila de análise de algoritmos), o que determina o tempo total de
execução, mas não o comportamento genérico dos vários algoritmos.
página 24
Projeto e Análise de Algoritmos
Algoritmos de Ordenação
III.8. BIBLIOGRAFIA
[2] Robert Sedgewick, Algorithms in C++, Parts 1 -4, Terceira Edição, Addison
Wesley Publishing Co., 1998
[5] P. Veloso, C. dos Santos, P. Azeredi, A. Furtado, Estruturas de dados, 15ª ed.
Ed. Campus, 1983
página 25