Universidade Federal do Rio de Janeiro (UFRJ)
Material 3 – Ordenação
Tem-se
bons exemplos
de como resolver
problemas através de computador
Serve
para
facilitar
a
recuperação
posterior de itens do conjunto ordenado
Relaciona-se com problemas do
dia a dia
Bubble Sort:
ordenação por bolha
Insertion Sort:
ordenação por inserção
Selection Sort:
ordenação por seleção
Quick Sort:
ordenação rápida
Bubble Sort:
ordenação por bolha
Insertion Sort:
ordenação por inserção
Selection Sort:
ordenação por seleção
Quick Sort:
ordenação rápida
Heap Sort:
ordenação cabeça
Conhecido como o
método da bolha
Um dos algoritmos mais
simples
Algoritmo:
1. Percorra o vetor (ex. lista em python) todo, comparando elementos adjacentes (2 a 2)
2. Troque as posições se eles estiverem fora de ordem
3. Repita os dois primeiros passos até obter a
Algoritmo Bubble 1:
vamos percorrer a lista 5vezes (número de elementos), fazendo as
comparações aos pares. Serão feitas 4 comparações por corrida. A ordenação deve ser ascendente.
7
Algoritmo Bubble 1: vamos percorrer a lista 5 vezes (nº de elementos), fazendo as comparações aos pares. Serão feitas 4 comparações por corrida.
1 5 0 8 3
1 > 5 F – Não troca
1 5 0 8 3
5 > 0 V – Troca
1 0 5 8 3
5 > 8 F – Não troca
1 0 5 8 3
5 0
Aux
0 0 0 5
Aux
8 3 3 3 3 8
Faça um programa, onde o usuário deve informar o
Algoritmo Bubble 1: vamos percorrer a lista 5 vezes (nº hipotético de elementos), fazendo as comparações aos pares. Serão feitas 4 comparações ( 5 – 1 elementos) por corrida.
Análise de complexidade do algoritmo:
5 (5
–
1) = n (n
–
1) = n^2
–
n
=
O(n^2)
=
No Bubble Sort 1:
1. Percorremos o vetor (ex. lista em python) todo comparando elementos adjacentes (2 a 2)
2. Trocamos as posições quando estavam fora de ordem
3. Repetimos os dois primeiros passos, em um nº de corridas igual ao nº de elementos do vetor
No Bubble Sort 2 (melhor):
1. Percorrer o vetor (ex. lista em python),
comparando elementos adjacentes (2 a 2)
2. Trocar as posições quando estiverem fora de ordem
Algoritmo Bubble 2 (melhor): percorrer a lista pelo menos uma vez. Depois repetir apenas se houve troca. Além disso, as comparações devem ser feitas decrementando sempre um elemento da direita.
13
1 5 0 8 3
1 > 5 F – Não troca
1 5 0 8 3
5 > 0 V – Troca
1 0 5 8 3
5 > 8 F – Não troca
1 0 5 8 3
8 > 3 V – Troca
5 0
Aux
0 0 0 5
Aux
8 3
Aux
3 3 3 8
Aux
Altere o primeiro programa, de modo que a lista
Algoritmo Bubble 2: vamos percorrer a lista no mínimo uma vez e no máximo 4 vezes (5 – 1 elemento), fazendo as comparações aos pares. Serão feitas
n - 1 comparações na 1ª iteração, n-2na 2ª ... até 1 comparação.
Análise de complexidade do algoritmo:
Melhor caso:
1 (5
–
1) = 1 (n
–
1) = n
–
1
=
O(n)
=
Análise de complexidade do algoritmo:
Pior caso:
(5-1)+(5-2)+(5-3)+(5-4)) =
(n-1)+(n-2)+....+2+1))
= n(n-1+1)/2
O(n^2)
=
Ordem quadrática
Algoritmo Bubble 2: vamos percorrer a lista no mínimo uma vez e no máximo 4 vezes (5 – 1 elemento), fazendo as comparações aos pares. Serão feitas
Bubble Sort:
ordenação por bolha
Selection Sort:
ordenação por seleção
Insertion Sort:
ordenação por inserção
Quick Sort:
ordenação rápida
Heap Sort:
ordenação cabeça
Conhecido como
ordenação por seleção
Também é um algoritmo
simples
Algoritmo:
1. Selecione o menor elemento do vetor
2. Troque-o com o item da 1ª posição do vetor
3. Repita os dois primeiros passos com os n-1
elementos, n-2, n-3 até restar 1 elemento
Ilustração do método:
Antes 1ª iteração: O R D E N A
i = 0 – Houve Troca A R D E N O
Ilustração do método:
Antes 2ª iteração: A R D E N O
Ilustração do método:
Antes 3ª iteração: A D R E N O
i = 0 – Houve Troca A R D E N O i = 1 – Houve Troca A D R E N O i = 2 – Houve Troca A D E R N O
Ilustração do método:
Antes 4ª iteração: A D E R N O
Ilustração do método:
Antes 5ª iteração: A D E N R O
i = 0 – Houve Troca A R D E N O i = 1 – Houve Troca A D R E N O i = 2 – Houve Troca A D E R N O i = 3 – Houve Troca A D E N R O i = 4 – Houve Troca A D E N O R
Implemente um programa, em python, que seja capaz
Bubble Sort:
ordenação por bolha
Selection Sort:
ordenação por seleção
Insertion Sort:
ordenação por inserção
Quick Sort:
ordenação rápida
Heap Sort:
ordenação cabeça
Conhecido como
ordenação por inserção
Algoritmo:
1. Em cada passo, a partir da 2ª posição do vetor, faça:
Selecione o i-ésimo item do vetor
Ilustração do método:
Chaves iniciais: O R D E N A
i = 1 O R D E N A
i = 2 D O R E N A
i = 3 D E O R N A
i = 4 D E N O R A
i = 5 A D E N O R
Implemente um programa, em python, que seja capaz
Bubble Sort:
ordenação por bolha
Selection Sort:
ordenação por seleção
Insertion Sort:
ordenação por inserção
Quick Sort:
ordenação rápida
Heap Sort:
ordenação cabeça
Conhecido como
ordenação rápida
◦
Publicado por Hoare em 1962;
◦
O
mais
rápido
que
se
conhece
para
ordenação interna;
◦
Provavelmente o
mais utilizado
;
Conhecido como
ordenação rápida
Algoritmo de Partição (parte 1):
1. Escolha arbitrariamente um pivô;
2. Percorra o vetor a partir da esquerda até que
L[i]>= pivô;
3. Percorra o vetor a partir da direita até que L[j]<= pivô;
4. Troque L[i] com L[j];
5. Continue até que os índices i e j se cruzem.
Conhecido como
ordenação rápida
Algoritmo recursivo (parte 2):
1. Sempre que os índices se cruzarem o processo deve ser reiniciado para cada um dos pedaços distintos: L[início] até L[j] e L[i] até L[fim];
2. Quando em um pedaço houver apenas um
33
2
8
6 10
4
7
3
Pivô = len(L) // 2
2
8
6 10
4
7
3
Pivô = 4
i
j
35
2
8
6 10
4
7
3
Pivô = 4
i
j
2
8
6 10
4
7
3
Pivô = 4
i
j
37
2
8
6 10
4
7
3
Pivô = 4
i
j
2
8
6 10
4
7
3
Pivô = 4
i
j
39
2
8
6 10
4
7
3
Pivô = 4
i
j
“i” e “j” Parados!
2
8
6 10
4
7
3
Pivô = 4
i
j
41
2
8
6 10
4
7
3
Pivô = 4
i
j
2
8
6 10
4
7
3
Pivô = 4
i
j
43
2
8
6 10
4
7
3
Pivô = 4
i
j
2
8
6 10
4
7
3
Pivô = 4
i
j
45
2
8
6 10
4
7
3
Pivô = 4
i
j
“i” e “j” Parados!
2
8
6 10
4
7
3
Pivô = 4
j
i
47
2
8
6 10
4
7
3
i
j
“i” e “j” se cruzaram. O vetor é particionado e o processo
2
8
6 10
4
7
3
i
j
L[i] >= Pivô?
49
2
8
6 10
4
7
3
i
j
Pivô = 8
2
8
6 10
4
7
3
i
j
Pivô = 8
51
2
8
6 10
4
7
3
i
j
Pivô = 8
“i” e “j” Parados!
2
8 6
10
4
7
3
i
j
Pivô = 8
53
2
8 6
10
4
7
3
i
j
Pivô = 8
2
8 6
10
4
7
3
i j
Pivô = 8
55
2
8 6
10
4
7
3
i j
Pivô = 8
2
8 6
10
4
7
3
i j
Pivô = 8
57 2 8 6 10 4 7 3
i
j
Pivô = 8
2
8 6
10
4
7
3
Implemente um programa, em python, que seja capaz
61
SZWARCFITER, Jayme; MARKENZON, Lilian.
Estruturas de Dados e seus Algoritmos, 3ª Edição.
ZIVIANI, Nivio. Projeto de Algoritmos, 2ª Edição .