i ae f e l d o ordenação e s o s o -...
TRANSCRIPT
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
Universidade Federal do Espírito SantoCentro de Ciências Agrárias – CCA UFESDepartamento de Computação
Tópicos Especiais em ProgramaçãoSite: http://jeiks.net E-mail: [email protected]
Ordenação
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
2
Introdução● Os algoritmos de ordenação são fundamentais na área da computação e
estão presentes em uma grande quantidade de problemas de programação:– Ordenação é útil para operações que resolvem de forma eficiente várias tarefas que
todos programadores encontram.
Assim, logo que encontrar um caso em que se aplique a ordenação, utilize as rotinas adequadas para ter menos trabalho em seu problema.
– Literalmente, diversos algoritmos de ordenação tem sido desenvolvidos, cada um é aplicado a uma tipo específico de dados/ordenação.
● Vários algoritmos de ordenação possuem outras técnicas de computação, como:– Dividir para conquistar;
– Utilização de aleatoriedade;
– Inserção; e
– Estruturas de dados avançadas.
● Maioria dos problemas de computação (e também matemáticos) seguem esses algoritmos.
● O objetivo da aula de hoje é ver as principais aplicações de ordenação e também a teoria por trás dos algoritmos mais importantes. Também veremos as bibliotecas de ordenação que podemos utilizar.
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
3
Aplicações da Ordenação
● A chave para entender ordenação é ver como ela pode ser utilizara para resolver problemas importantes de programação:– Teste de singularidade:
● Como testar se os elementos de um conjunto de itens são todos distintos (únicos)?
Deve-se ordená-los, tanto em ordem crescente quanto decrescente. Assim, qualquer item repetido ficará próximo do outro.Ao passar uma vez pelos elementos, basta testar se vet[i] == vetor[i+1].
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
4
Aplicações da Ordenação
● …– Apagar duplicatas:
● Como nós podemos remover tudo, mas manter uma cópia de índices repetidos de um conjunto?
Deve-se ordenar e varrer todos os elementos novamente.
A melhor forma de fazer isso é mantendo dois índices:anterior e atual.
O anterior deve apontar para o último elemento que foi apagado do vetor e o atual deve apontar para o próximo elemento a ser considerado.
Se vet[anterior] != vet[atual], incremente o índice anterior e copie vet[atual] para vet[anterior].
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
5
Aplicação da Ordenação
● ...– Priorizar eventos:
● Suponha que nos seja dado um conjunto de trabalhos para fazer, cada um com um tempo limite de entrega.
Ordenando os itens de acordo com a data de entrega (ou outros critérios) colocará os trabalho na ordem correta de processá-los.
Filas de prioridade (priority queue) são úteis para manter calendários ou agendamentos quando há inserções e remoções. Mas a ordenação ajuda se um conjunto de eventos não modifica durante a execução.
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
6
Aplicação da Ordenação
● …– Mediano/Seleção:
● Suponha que seja necessário encontrar o enésimo mairo item de um conjunto S.
Após ordenar os itens em ordem crescente, o item desejado será colocado na localização S[k].
Isso também pode ser utilizado para encontrar os menores, maiores, e os elementos medianos de um conjunto.
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
7
Aplicação da Ordenação● …
– Contagem de frequência:● Qual é o elemento que mais se repete no conjunto?
Após ordenar, uma varredura dos dados permite contar o número de vezes que cada elemento ocorre.
– União e Interseção de Conjuntos:● Como realizar a união ou interseção de dois elementos de dois
conjuntos A e B?
Se ambos os conjuntos forem ordenados, nós podemos então criar um novo conjunto C pegando o menor de cada conjunto A e B.
A B
2 5
5 6
8 9
19 10
22 14
45 40
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
8
Aplicação da Ordenação
● …– Reconstruindo a ordem original:
● Se for necessário restaurar um arranjo após realizar permutações no mesmo, a ordenação pode ajudar.
Pode-se adicionar um campo extra no tipo de registro que é armazenado na lista. Cada item passa a ter um índice que pode ser ordenado:
struct item {
int idx;
// outros dados do item
}
O idx do item 1 pode ser colocado como 1, o idx do item 2 como 2, etc.
Agora, você pode mover este item para qualquer lugar, depois disso, basta reordenar a lista pelo idx.
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
9
Aplicação da Ordenação● …
– Encontrando um par desejado:● Como testar se existem dois inteiros x, y que pertencem ao conjunto,
sabendo que x+y deve ser igual a um valor z?
Ao invés de testar todos os pares possíveis, pode-se ordenar os números em ordem crescente e percorrê-los.
Sendo S[i] incrementado com i, é possível encontrar um parceiro j no qual S[j] = z – S[i].
posição item Objetivo: 21
1 2 i = 1, j = 10 2 == (21 – 20) FALSO
2 4 I = 2, j = 9 4 == (21 – 18) FALSO
3 5 I = 3, j = 8 5 == (21 – 16) VERDADEIRO
4 6 I = 4, j = 7 6 == (21 – 14) FALSO
5 8 I = 5, j = 6 8 == (21 – 12) FALSO
6 12 I = 6, j = 5 12 == (21 – 8) FALSO
7 14 I = 7, j = 4 14 == (21 – 6) FALSO
8 16 I = 8, j = 3 16 == (21 – 5) VERDADEIRO
9 18 I = 9, j = 2 18 == (21 – 4) FALSO
10 20 I = 10, j = 1 20 == (21 – 2) FALSO
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
10
Aplicação da Ordenação
● …– Pesquisa eficiente:
● Como pode-se testar de forma eficiente se o elemento está dentro do conjunto?
Após ordenar o vetor, pode-se fazer uma pesquisa binária para encontrar o elemento.
Essa talvez seja a forma mais simples de aplicar a ordenação.
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
11
Algoritmos de Ordenação
● Existem muitos algoritmos de ordenação, sendo comuns:– Bolha;
– Inserção;
– Seleção;
– Heapsort;
– Mergesort;
– Quicksort;
– Radix sort;
– Distribuição/Binária;
– Shell sort;
– Árvore;
– Árvore binária;
– ...
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
12
Algoritmos de Ordenação
● A implementação deles pode ser descartada quando já existem nas bibliotecas existentes em sua linguagem de programação.
● A razão real de estudar os algoritmos de ordenação é que as ideias por trás deles são as mesmas que aparecem por trás de vários outros problemas de programação.
● O ideal é saber de coisas, como:– O heapsort trabalha bem com estruturas de dados;
– O quicksort trabalha bem com aleatoridade;
– O mergesort trabalha com dividir-para-conquistar; e
– Que existem um enorme conjunto de algoritmos e ferramentas para utilizar.
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
13
Algoritmos de Ordenação
● Os algoritmos que estudaremos aqui são:– Seleção;
– Inserção;
– Quicksort;
● É ideal entender as propriedades que estão em cada algoritmo.
● Logo após:– Apresentação da comparação de diversos algoritmos;
– E bibliotecas do STL C++.
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
14
Seleção● Este algoritmo divide o vetor em partes ordenadas e não ordenadas.● Em cada iteração, ele encontra o menor elemento do restante do
vetor e o move para o final da região já ordenada.● Características:
– Faz um monte de comparações;
– Mas é bastante eficiente sesoubermos o máximo de dadosdo problema;
– Pior caso: ocorrerá n-1 permutações;
– Isso também mostra o poderdas estruturas de dados:
Se utilizar uma fila de prioridades,para manter os dados não ordenadosdo conjunto, a ordenação por seleçãocairá de O(n2) paraO(n log n), a mesma do heapsort.
selection_sort(int s[], int n){
int i,j;int min;
for (i=0; i<n; i++) { min=i; for (j=i+1; j<n; j++)
if (s[j] < s[min]) min=j; troca(&s[i],&s[min]);
}}
selection_sort(int s[], int n){
int i,j;int min;
for (i=0; i<n; i++) { min=i; for (j=i+1; j<n; j++)
if (s[j] < s[min]) min=j; troca(&s[i],&s[min]);
}}
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
15
Seleção
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
16
Inserção● Este algoritmo também mantém partes ordenadas e não
ordenadas no array.● Em cada iteração, o elemento que está não ordenado se move
para sua posição apropriada dentro da região ordenada.● Características:
– Minimiza a quantidade demovimentação dos dados;
– Cada inversão é umapermutação;
– Cada troca na inserçãoelimina exatamente umainversão;
– É ideal quando os dadosestão quase ordenados;
– Mantém a ordenação de chaves anteriores...
insertion_sort(int s[], int n){ int i,j; for (i=1; i<n; i++) { j=i; while((j>0) && (s[j] < s[j1])){ swap(&s[j],&s[j1]); j = j1; } }}
insertion_sort(int s[], int n){ int i,j; for (i=1; i<n; i++) { j=i; while((j>0) && (s[j] < s[j1])){ swap(&s[j],&s[j1]); j = j1; } }}
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
17
Inserção
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
18
Quicksort● Este algoritmo reduz o trabalho de ordenar
um vetor grande fazendo a divisão do vetor em partes menores e ordenando-as.
● Ele escolhe o menor e o maior elemento e separa o vetor em duas partes.
● Devido a cada elemento não ser mais movido para fora dessa região, cada sub vetor pode ser ordenado de forma independente.
● Para facilitar a ordenação das partes, os argumentos do quicksort incluem o índice do primeiro e do último elemento de cada parte.
● Características:– Quando implementado de forma correta, ele é
o algoritmo de ordenação mais rápido na memória;
– É um belo exemplo do poder da recursividade;.
quicksort(int s[], int l, int h){ int p; if ((hl)>0) { p = partition(s,l,h); quicksort(s,l,p1); quicksort(s,p+1,h); }}int partition(int s[], int l, int h){ int i; int p; int firsthigh;
p = h; firsthigh = l; for (i=l; i<h; i++) if (s[i] < s[p]) { swap(&s[i], &s[firsthigh]); firsthigh ++; } swap(&s[p], &s[firsthigh]);}
quicksort(int s[], int l, int h){ int p; if ((hl)>0) { p = partition(s,l,h); quicksort(s,l,p1); quicksort(s,p+1,h); }}int partition(int s[], int l, int h){ int i; int p; int firsthigh;
p = h; firsthigh = l; for (i=l; i<h; i++) if (s[i] < s[p]) { swap(&s[i], &s[firsthigh]); firsthigh ++; } swap(&s[p], &s[firsthigh]);}
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
19
QuickSort
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
20
Outros algoritmos
Referência:
<http://www.sorting-algorithms.com>
Referência:
<http://www.sorting-algorithms.com>
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
21
Utilizando a STL C++
● Sort da Standard Template Library:– Muito eficiente;
– Muito testado;
– Simples de utilizar;
– Pode-se sobrecarregar sua função de ordenação.
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
22
Utilização do sort#include <iostream>#include <algorithm>using namespace std;int main() { int a[7] = {23, 1, 33, 20, 6, 6, 9};
// a = 1º elemento. // a+7 = 1 após o ultimo elemento. sort(a, a+7); for (int i=0; i<7; i++) { cout << a[i] << " "; }}
#include <iostream>#include <algorithm>using namespace std;int main() { int a[7] = {23, 1, 33, 20, 6, 6, 9};
// a = 1º elemento. // a+7 = 1 após o ultimo elemento. sort(a, a+7); for (int i=0; i<7; i++) { cout << a[i] << " "; }}
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
23
Sobrecarga do sortstruct maratona { char equipe; int corretos; int errados;
bool operator<(const maratona &m2) const { if (corretos == m2.corretos) { if (errados == m2.errados) return toupper(equipe) > toupper(m2.equipe); else return errados < m2.errados; } else return corretos > m2.corretos; }}; //
struct maratona { char equipe; int corretos; int errados;
bool operator<(const maratona &m2) const { if (corretos == m2.corretos) { if (errados == m2.errados) return toupper(equipe) > toupper(m2.equipe); else return errados < m2.errados; } else return corretos > m2.corretos; }}; //
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
24
Problema para vocês● Rihanna tem uma academia de dança e vai participar de uma
competição. Como todos seus alunos desejam ser seu parceiro, ela resolveu escolher quem tem as medidas ideais. Assim:– O primeiro critério será a altura: o mais próximo de 180 cm.
– O segundo critério será o peso: o mais próximo de 75kg, sem ultrapassar.
– O terceiro critério será a ordem crescente do sobrenome da pessoa.
● Entradas:– Nome (sempre primeiro e último) Altura (sempre cm) Peso (sempre kg).
● Saídas:– Lista com todos os classificados, ordenados pelos critérios de escolha.
Exemplo de entrada:George Bush 195 110Harry Truman 180 75Bill Clinton 180 75John Kennedy 180 65Ronald Reagan 165 110Richard Nixon 170 70Jimmy Carter 180 77
Exemplo de entrada:George Bush 195 110Harry Truman 180 75Bill Clinton 180 75John Kennedy 180 65Ronald Reagan 165 110Richard Nixon 170 70Jimmy Carter 180 77
Exemplo de saída:Clinton, BillTruman, HarryKennedy, JohnCarter, JimmyNixon, RichardBush, GeorgeReagan, Ronald
Exemplo de saída:Clinton, BillTruman, HarryKennedy, JohnCarter, JimmyNixon, RichardBush, GeorgeReagan, Ronald
Unive rsidad e F
ede ral do Espír ito S
a nto – CC
A U
FE
S
25
Problemas
● Fáceis:– Vito's Family;
– Stacks of Flapjacks;
● Intermediários:– Longest Nap;
– Shoemarker's Problem;
– ShellSort;
● Difíceis:– Bridge;
– Football (aka Soccer).