Aula 17: - Métodos simples de ordenação

Propaganda
MCTA028 – Programação Estruturada
Aula 17:
- Métodos simples de ordenação
Prof. Jesús P. Mena-Chalco
[email protected]
3Q-2016
1
Ordenação
Ordenar corresponde ao processo de re-arranjar um
conjunto de objetos em ordem ascendente ou descendente.
Por que ordenar?
O objetivo principal da ordenação é facilitar a recuperação
posterior de itens do conjunto ordenado.
Geralmente considerado no primeiro passo para resolver um
problema prático.
As ordens mais utilizadas são a numérica e lexicográfica.
2
21/03/2016
3
Por que ordenar?
Busca de elementos:
O usuário geralmente quer os dados ordenados.
Deduplicação de elementos:
Ordenar é muito útil para eliminar duplicações.
Projeção de objetos em um espaço 3D.
Criação de uma árvore geradora mínima.
Ordenar é o primeiro passo para “carregar” os dados em uma
estrutura tipo árvore B+.
4
Algoritmos para ordenar elementos
Baseado em comparações:
Bogo sort
Selection sort
Insertion sort
Bubble sort
Mergesort
Quicksort
Heapsort
Ordenação em tempo linear:
Radix sort
Ordenação de primeiros elementos (seleção parcial):
Partial Quicksort
5
O problema de ordenar na forma crescente
Um vetor v[0..n-1] é crescente se v[0] ≤ v[1] ≤ … ≤ [n-1]
O problema de ordenação de um vetor consiste em
rearranjar (ou seja, permutar) os elementos de um vetor
v[0..n-1] de tal modo que ele se torne crescente.
Vetores ordenados na forma crescente:
{1, 1, 1, 1, 1, 1, 1, 1}
{0, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 100}
6
Verificar se um vetor v[0..n-1] é crescente
7
Número de comparações T(n):
- No melhor caso: T(n) = 1
- No pior caso: T(n) = n-1
T(n) = O(n)
Crie uma versão recursiva da função crescente
Atividade em aula
8
Vetor crecente (recursiva)
Número de comparações T(n):
- No melhor caso: T(n) = 1
- No pior caso: T(n) = n-1
T(n) = O(n)
9
Embaralhando um vetor
10
Número de trocas de elementos T(n):
- No melhor caso: T(n) = n
- No pior caso: T(n) = n
T(n) = O(n)
11
(1)
Bogo sort
Miracle sort
Monkey sort
Stupid sort
12
Número de comparações T(n):
- No melhor caso: T(n) = n-1
- No pior caso: T(n) = ?
13
(2)
Selection Sort:
Algoritmo de ordenação por seleção
14
Selection Sort
Animação: https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
15
Selection Sort
Complexidade computacional: No pior caso?
16
Selection Sort
Quanto tempo o algoritmo consome para fazer o serviço?
(A complexidade computacional é proporcional ao número de
comparações v[iMin]>v[j])
17
Selection Sort
Quanto tempo o algoritmo consome para fazer o serviço?
(A complexidade computacional é proporcional ao número de
comparações v[iMin]>v[j])
9
8
7 6
5
4
3
2 1
1
8
7 6
5
4
3
2 9
1 iteração
n-1
2 iteração
n-2
3 iteração
n-3
…
n-1iteração
1
18
Selection Sort
1 iteração
2 iteração
3 iteração
…
n-1iteração
n-1
n-2
n-3
Tempo = (n–1)(n)/2
Tempo = n²/2 – n/2
1
Se o vetor tiver n=10,000 elementos, o número de comparações
(tempo) será proporcional a: 49,995,000.
Se o computador fizer 1000 comparações por segundo, o tempo
gasto será de: 49995 segundos = 832.25 min = 13.88 horas
19
Selection Sort
Tempo = (n–1)(n)/2
Tempo = n²/2 – n/2
Número de comparações para
qualquer caso
T(n) = n²/2 – n/2
T(n) = O(n²)
20
Selection Sort
Número de comparações: No pior caso = O(n²)
140000
120000
100000
80000
tempo
60000
40000
20000
490
470
450
430
410
390
370
350
330
310
290
270
250
230
n
210
190
170
150
130
110
90
70
50
30
10
0
21
Versão recursiva do Selection Sort
22
(3)
Insertion Sort:
Algoritmo de ordenação por inserção
23
Insertion Sort
Método preferido dos jogadores de cartas
Em cada passo, a partir do i=1, o i-ésimo elemento
da sequência fonte é apanhado e transferido para a
sequência destino, sendo inserido no seu lugar
apropriado.
0
1
2
3
4
5
1
5
7
10
55
6
1
5
7
10
55
6
…
6
Animação: https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
24
Insertion Sort
A principal característica deste algoritmo consiste em ordenar
o vetor utilizando um subvetor ordenado em seu inicio.
A cada novo passo, acrescentamos a este subvetor mais
um elemento até atingirmos o último elemento de um
arranjo.
Ordenado
Sem ordem
25
void InsertionSort (int[] v, int n)
26
Insertion Sort
Número de comparações T(n):
- No melhor caso: T(n) = n-1
- No pior caso: T(n) = ?
P2: Versão recursiva?
27
Insertion Sort
n=7
0
1 2 3
Comparações
4 5 6
L=
i=1
1
i=2
2
i=3
3
…
i=n-1
Este algoritmo é o mais apropriado quando
os elementos do vetor estiverem
semi-ordenados.
n-1
Tempo = (n–1)(n)/2
Tempo = n²/2 – n/2
Tempo = O(n²)
28
(4)
Bubble Sort:
Ordenação pelo método da bolha
Ordenação por troca dois-a-dois
29
Bubble Sort
O algoritmo de ordenação baseado em troca, consiste em
intercalar pares de elementos que não estão em ordem até
que não exista mais pares.
O principio do bolha é a troca de valores entre posições
consecutivas fazendo com que os valores mais altos
“borbulhem” para o final do vetor.
Animação: https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html
30
Bubble Sort
Crie uma função iterativa que permita ordenar de
forma ascendente uma lista dada como entrada.
void BubbleSort (int[] v, int n)
31
Bubble Sort
n=7
0
1 2 3
4 5 6
L=
Comparações
k=n-1
n-1
k=n-2
n-2
k=n-3
n-3
…
k=1
1
Tempo = (n–1)(n)/2
Tempo = n²/2 – n/2
32
Bubble Sort
Número de comparações T(n):
- No melhor caso: T(n) = n²/2 – n/2
- No pior caso: T(n) = n²/2 – n/2
Número de comparações T(n):
- No melhor caso: T(n) = n-1
- No pior caso:
T(n) = n²/2 – n/2
33
Download