i ae f e l d o ordenação e s o s o -...

25
U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o C C A U F E S Universidade Federal do Espírito Santo Centro de Ciências Agrárias – CCA UFES Departamento de Computação Tópicos Especiais em Programação Site: http://jeiks.net E-mail: [email protected] Ordenação

Upload: doanh

Post on 11-Dec-2018

220 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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

Page 2: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t 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.

Page 3: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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].

Page 4: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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].

Page 5: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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.

Page 6: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t 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.

Page 7: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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

Page 8: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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.

Page 9: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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

Page 10: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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.

Page 11: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t 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;

– ...

Page 12: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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.

Page 13: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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++.

Page 14: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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]);

}}

Page 15: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

Unive rsidad e F

ede ral do Espír ito S

a nto – CC

A U

FE

S

15

Seleção

Page 16: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t 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[j­1])){      swap(&s[j],&s[j­1]);      j = j­1;    }  }}

insertion_sort(int s[], int n){  int i,j;  for (i=1; i<n; i++) {    j=i;    while((j>0) && (s[j] < s[j­1])){      swap(&s[j],&s[j­1]);      j = j­1;    }  }}

Page 17: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

Unive rsidad e F

ede ral do Espír ito S

a nto – CC

A U

FE

S

17

Inserção

Page 18: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t 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 ((h­l)>0) {   p = partition(s,l,h);   quicksort(s,l,p­1);   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 ((h­l)>0) {   p = partition(s,l,h);   quicksort(s,l,p­1);   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]);}

Page 19: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

Unive rsidad e F

ede ral do Espír ito S

a nto – CC

A U

FE

S

19

QuickSort

Page 20: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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>

Page 21: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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.

Page 22: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t 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] << " ";    }}

Page 23: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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;  }}; //

Page 24: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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

Page 25: i ae F e l d o Ordenação E s o S o - jeiks.netjeiks.net/wp-content/uploads/2014/08/TEP_Slides-04.pdf · U n i v e r s i d a d e F e d e r a l d o E s p í r i t o S a n t o –

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).