CES11 ALGORITMOS E ESTRUTURAS DE DADOS Captulo VIII

  • Slides: 67
Download presentation
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Capítulo VIII Técnicas de Ordenação e Procura

CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Capítulo VIII Técnicas de Ordenação e Procura

Capítulo VIII – Técnicas de Ordenação e Procura 8. 1 – Introdução 8. 2

Capítulo VIII – Técnicas de Ordenação e Procura 8. 1 – Introdução 8. 2 – Métodos simples de ordenação 8. 3 – O método Quick-Sort 8. 4 – O método Heap-Sort 8. 5 – O método Merge-Sort 8. 6 – Tabelas Hash

8. 1 – Introdução n Ordenação é uma atividade importantíssima em processamento automático de

8. 1 – Introdução n Ordenação é uma atividade importantíssima em processamento automático de informações n Que tal procurar Um nome numa lista telefônica - Um nome numa lista de contas bancárias - Uma palavra em um dicionário linguístico - se os nomes ou palavras não estiverem em ordem alfabética?

n O processo de ordenação se aplica a um conjunto de objetos em que

n O processo de ordenação se aplica a um conjunto de objetos em que se possa verificar entre eles a relação (menor ou igual), ou (maior ou igual) n Os conjuntos mais comuns são vetores de Números - Nomes ou strings em geral -

n Vetores de estruturas também podem ser ordenados n Exemplo: relação com diversas informações

n Vetores de estruturas também podem ser ordenados n Exemplo: relação com diversas informações sobre os funcionários de uma empresa:

n Este vetor pode ser ordenado por qualquer campo dessas estruturas: Ordem alfabética dos

n Este vetor pode ser ordenado por qualquer campo dessas estruturas: Ordem alfabética dos nomes ou dos setores - Ordem crescente ou decrescente de salários ou de idade - n O campo de um vetor de estruturas usado para ordená-lo é denominado chave da ordenação

n Existem vários algoritmos para fazer ordenação de vetores: - n Alguns mais simples,

n Existem vários algoritmos para fazer ordenação de vetores: - n Alguns mais simples, porém ineficientes Outros mais eficientes, porém mais complexos Alguns critérios para julgar a eficiência dos algoritmos de ordenação: - Número de comparações de chaves Número de movimentações de elementos

n O tempo de comparação depende da chave usada: - n Para números, basta

n O tempo de comparação depende da chave usada: - n Para números, basta um dos operadores ou ; Para strings, usa-se funções para compará-las; exemplo: strcmp da linguagem C Há casos de chaves múltiplas, como a ordenação por idade, sendo dada a data de nascimento: - Compara-se primeiramente o ano, depois o mês e finalmente o dia Nestes casos, a comparação é mais complexa e pode ser conveniente um subprograma específico

n O tempo de movimentação depende do tipo e tamanho dos elementos do vetor

n O tempo de movimentação depende do tipo e tamanho dos elementos do vetor a ser ordenado: - Para números, a movimentação é pequena - Para grandes estruturas, há grande movimentação de dados

n No caso de grandes estruturas, usa-se um vetor de ponteiros, cada um para

n No caso de grandes estruturas, usa-se um vetor de ponteiros, cada um para uma estrutura do vetor Pont 1 2 3 4 5 6 7 8 Nome Setor Salário Gilberto Antonio Data de Nascimento Dia Mês Ano 03 05 1980 05 12 1970 Almox Admin 850 2300 Pedro Augusto Claudio Marcos Nilton Vicente 23 05 07 17 20 15 Fabric Diret Ferram Recep Proj Contr 1050 8000 1850 2300 2000 07 10 03 11 01 08 1975 1960 1984 1976 1982 1979

n Para a ordenação basta alterar os apontamentos, evitando-se a movimentação dessas estruturas Pont

n Para a ordenação basta alterar os apontamentos, evitando-se a movimentação dessas estruturas Pont 1 2 3 4 5 6 7 8 Nome Setor Salário Gilberto Antonio Data de Nascimento Dia Mês Ano 03 05 1980 05 12 1970 Almox Admin 850 2300 Pedro Augusto Claudio Marcos Nilton Vicente 23 05 07 17 20 15 Fabric Diret Ferram Recep Proj Contr 1050 8000 1850 2300 2000 07 10 03 11 01 08 1975 1960 1984 1976 1982 1979

n No restante deste capítulo, para maior simplicidade, os algoritmos irão atuar sobre vetores

n No restante deste capítulo, para maior simplicidade, os algoritmos irão atuar sobre vetores de inteiros n A seguinte declaração será usada por esses algoritmos: typedef int vetor [nmax] (nmax é o número máximo de elementos dos vetores) n Para vetores de outros tipos, basta alterar as comparações e os movimentos de elementos n São apresentados a seguir três métodos simples de ordenação e, depois, três outros mais eficientes

Capítulo VIII – Técnicas de Ordenação e Procura 8. 1 – Introdução 8. 2

Capítulo VIII – Técnicas de Ordenação e Procura 8. 1 – Introdução 8. 2 – Métodos simples de ordenação 8. 3 – O método Quick-Sort 8. 4 – O método Heap-Sort 8. 5 – O método Merge-Sort 8. 6 – Tabelas Hash

8. 2 – Métodos Simples de Ordenação n Tais métodos são considerados lentos (0(n

8. 2 – Métodos Simples de Ordenação n Tais métodos são considerados lentos (0(n 2) no pior caso e no caso médio) n São usados para ordenar vetores pequenos n São apresentados aqui três desses métodos: Bubble-Sort - Insertion-Sort - Selection-Sort -

8. 2. 1 – Bubble-Sort n O método consiste em: - Percorrer o vetor

8. 2. 1 – Bubble-Sort n O método consiste em: - Percorrer o vetor várias vezes - Durante cada percurso, efetuar troca de posição de elementos adjacentes, caso o elemento da esquerda seja maior que o da direita - Se, durante um dos percursos, não houver trocas, considera-se que o vetor está ordenado - Em cada percurso, um elemento atinge sua posição definitiva

Exemplo: seja o seguinte vetor e o método em seu início (cursor para i

Exemplo: seja o seguinte vetor e o método em seu início (cursor para i percorrer o vetor várias vezes) V 0 1 2 16 45 72 3 5 4 8 5 6 7 8 9 67 95 74 70 80 p (limitante de i a cada percurso) trocou (semáforo que acende quando há troca)

Não trocar i V 0 1 2 16 45 72 3 5 4 8

Não trocar i V 0 1 2 16 45 72 3 5 4 8 5 6 7 8 9 67 95 74 70 80 p trocou

Não trocar i V 0 1 2 16 45 72 3 5 4 8

Não trocar i V 0 1 2 16 45 72 3 5 4 8 5 6 7 8 9 67 95 74 70 80 p trocou

Trocar i V 0 1 2 16 45 72 3 5 4 8 5

Trocar i V 0 1 2 16 45 72 3 5 4 8 5 6 7 8 9 67 95 74 70 80 p trocou

Trocar i V 0 1 16 45 2 5 3 72 4 8 5

Trocar i V 0 1 16 45 2 5 3 72 4 8 5 6 7 8 9 67 95 74 70 80 p trocou

Trocar i V 0 1 16 45 2 5 3 8 4 5 6

Trocar i V 0 1 16 45 2 5 3 8 4 5 6 7 8 9 72 67 95 74 70 80 p trocou

Não trocar i V 0 1 16 45 2 5 3 8 4 5

Não trocar i V 0 1 16 45 2 5 3 8 4 5 6 7 8 9 67 72 95 74 70 80 p trocou

Trocar i V 0 1 16 45 2 5 3 8 4 5 6

Trocar i V 0 1 16 45 2 5 3 8 4 5 6 7 8 9 67 72 95 74 70 80 p trocou

Trocar i V 0 1 16 45 2 5 3 8 4 5 6

Trocar i V 0 1 16 45 2 5 3 8 4 5 6 7 8 9 67 72 74 95 70 80 p trocou

Trocar i V 0 1 16 45 2 5 3 8 4 5 6

Trocar i V 0 1 16 45 2 5 3 8 4 5 6 7 8 9 67 72 74 70 95 80 p trocou

95 em sua posição definitiva trocou acesa: começar novo percurso retroceder p V 0

95 em sua posição definitiva trocou acesa: começar novo percurso retroceder p V 0 1 16 45 2 5 3 8 4 5 6 7 8 9 67 72 74 70 80 95 p trocou A variável cursora ‘i’ não precisa chegar até V[8] Basta chegar até V[7]

Não trocar i V 0 1 16 45 2 5 3 8 4 5

Não trocar i V 0 1 16 45 2 5 3 8 4 5 6 7 8 9 67 72 74 70 80 95 p trocou

Trocar i V 0 1 16 45 2 5 3 8 4 5 6

Trocar i V 0 1 16 45 2 5 3 8 4 5 6 7 8 9 67 72 74 70 80 95 p trocou

Trocar i V 0 16 1 5 2 45 3 8 4 5 6

Trocar i V 0 16 1 5 2 45 3 8 4 5 6 7 8 9 67 72 74 70 80 95 p trocou

Não trocar i V 0 16 1 5 2 8 3 4 5 6

Não trocar i V 0 16 1 5 2 8 3 4 5 6 7 8 9 45 67 72 74 70 80 95 p trocou

Não trocar i V 0 16 1 5 2 8 3 4 5 6

Não trocar i V 0 16 1 5 2 8 3 4 5 6 7 8 9 45 67 72 74 70 80 95 p trocou

Não trocar i V 0 16 1 5 2 8 3 4 5 6

Não trocar i V 0 16 1 5 2 8 3 4 5 6 7 8 9 45 67 72 74 70 80 95 p trocou

Trocar i V 0 16 1 5 2 8 3 4 5 6 7

Trocar i V 0 16 1 5 2 8 3 4 5 6 7 8 9 45 67 72 74 70 80 95 p trocou

Não trocar i V 0 16 1 5 2 8 3 4 5 6

Não trocar i V 0 16 1 5 2 8 3 4 5 6 7 8 9 45 67 72 70 74 80 95 p trocou

80 em sua posição definitiva trocou acesa: iniciar novo percurso retroceder p V 0

80 em sua posição definitiva trocou acesa: iniciar novo percurso retroceder p V 0 16 1 5 2 8 3 4 5 6 7 8 9 45 67 72 70 74 80 95 p trocou

Trocar i V 0 16 1 5 2 8 3 4 5 6 7

Trocar i V 0 16 1 5 2 8 3 4 5 6 7 8 9 45 67 72 70 74 80 95 p trocou

Trocar i V 0 5 1 16 2 8 3 4 5 6 7

Trocar i V 0 5 1 16 2 8 3 4 5 6 7 8 9 45 67 72 70 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 72 70 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 72 70 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 72 70 74 80 95 p trocou

Trocar i V 0 5 1 8 2 3 4 5 6 7 8

Trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 72 70 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

74 em sua posição definitiva trocou acesa: novo percurso retroceder p V 0 5

74 em sua posição definitiva trocou acesa: novo percurso retroceder p V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

Não trocar i V 0 5 1 8 2 3 4 5 6 7

Não trocar i V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

72 em sua posição definitiva trocou apagada: vetor ordenado V 0 5 1 8

72 em sua posição definitiva trocou apagada: vetor ordenado V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95 p trocou

V 0 5 1 8 2 3 4 5 6 7 8 9 16

V 0 5 1 8 2 3 4 5 6 7 8 9 16 45 67 70 72 74 80 95

A função Bubble. Sort: void Bubble. Sort (int n, vetor V) { int i,

A função Bubble. Sort: void Bubble. Sort (int n, vetor V) { int i, p; logic trocou; for (p = n-2, trocou = TRUE; p >= 0 && trocou; p--) for (trocou = FALSE, i = 0; i <= p; i++) if (V[i] > V[i+1]) { Trocar (&V[i], &V[i+1]); trocou = TRUE; } } A cada vez que a condição do if se void Trocar (int *x, int *y) { verificar, haverá int temp; movimentação de 3 temp = *x; *x = *y; *y = temp; elementos }

5. 2. 2 – Insertion-Sort n O método considera o vetor sempre dividido em

5. 2. 2 – Insertion-Sort n O método considera o vetor sempre dividido em duas partes: a parte ordenada, do lado esquerdo, e a parte desordenada, do lado direito n Inicialmente, a parte ordenada contém apenas V[0]; depois, cada elemento da parte desordenada é inserido na parte ordenada, mantendo a ordenação n A cada elemento a ser inserido, percorre-se a parte ordenada até encontrar a posição correta para inserção

Exemplo: seja o vetor abaixo e o método no início da inserção de um

Exemplo: seja o vetor abaixo e o método no início da inserção de um elemento genérico i V 0 5 1 2 3 16 45 72 (cursor para percorrer a parte ordenada) 4 8 (cursor para o elemento a ser inserido) 5 6 7 8 9 67 95 74 70 80 j Parte ordenada Parte desordenada aux 8 aux = V[i]

aux < V[j]: V[j+1] recebe V[j]; retroceder j i V 0 5 1 2

aux < V[j]: V[j+1] recebe V[j]; retroceder j i V 0 5 1 2 3 16 45 72 4 8 5 6 7 8 9 67 95 74 70 80 j Parte ordenada Parte desordenada aux 8 aux = V[i]

aux < V[j]: V[j+1] recebe V[j]; retroceder j i V 0 5 1 2

aux < V[j]: V[j+1] recebe V[j]; retroceder j i V 0 5 1 2 3 4 5 6 7 8 9 16 45 72 72 67 95 74 70 80 j j Parte ordenada Parte desordenada aux 8 aux = V[i]

aux < V[j]: V[j+1] recebe V[j]; retroceder j i V 0 5 1 2

aux < V[j]: V[j+1] recebe V[j]; retroceder j i V 0 5 1 2 3 4 5 6 7 8 9 16 45 45 72 67 95 74 70 80 j j Parte ordenada Parte desordenada aux 8 aux = V[i]

aux >= V[j]: V[j+1] recebe aux; avançar a parte ordenada i V 0 5

aux >= V[j]: V[j+1] recebe aux; avançar a parte ordenada i V 0 5 1 2 3 4 5 6 7 8 9 16 16 45 72 67 95 74 70 80 j j Parte ordenada Parte desordenada aux 8 aux = V[i]

i V 0 5 1 8 i 2 3 4 5 6 7 8

i V 0 5 1 8 i 2 3 4 5 6 7 8 9 16 45 72 67 95 74 70 80 j Parte ordenada aux Parte desordenada 8 aux = V[i] O mesmo se repete até que tudo fique ordenado

A função Insertion. Sort: void Insertion. Sort (int n, vetor V) { int i,

A função Insertion. Sort: void Insertion. Sort (int n, vetor V) { int i, j, aux; logic achou; for (i = 1; i < n; i++) { aux = V[i]; achou = FALSE; j = i-1; while (j >= 0 && !achou) if (aux < V[j]) { A cada vez que a condição V[j+1] = V[j]; do if se verificar, haverá j--; movimentação de 1 } elemento else achou = TRUE; Antes e depois do while, if (j+1 != i) mais uma movimentação V[j+1] = aux; } }

5. 2. 3 – Selection-Sort n O método consiste em percorrer o vetor várias

5. 2. 3 – Selection-Sort n O método consiste em percorrer o vetor várias vezes n Durante cada percurso, seleciona o menor elemento, colocando-o em sua posição definitiva

Exemplo: seja o vetor abaixo e o método em seu início i V (cursor

Exemplo: seja o vetor abaixo e o método em seu início i V (cursor na posição de colocação do menor elemento do percurso) 0 1 2 16 45 72 3 5 4 8 5 6 7 8 9 67 95 74 70 80 (cursor para percorrer o vetor várias j vezes, para encontrar o menor elemento do percurso) indmin (destinado a guardar o índice do menor elemento de um percurso)

Após o 1º percurso: indmin i: trocar V[i] com V[indmin]; avançar i i V

Após o 1º percurso: indmin i: trocar V[i] com V[indmin]; avançar i i V 0 1 2 16 45 72 3 5 4 8 indmin 3 5 6 7 8 9 67 95 74 70 80

Após o 2º percurso: indmin i: trocar V[i] com V[indmin]; avançar i; i V

Após o 2º percurso: indmin i: trocar V[i] com V[indmin]; avançar i; i V 0 5 i 1 2 3 45 72 16 4 8 indmin 3 4 5 6 7 8 9 67 95 74 70 80

Após o 3º percurso: indmin i: trocar V[i] com V[indmin]; avançar i; i V

Após o 3º percurso: indmin i: trocar V[i] com V[indmin]; avançar i; i V 0 5 1 8 i 2 3 4 5 6 7 8 9 72 16 45 67 95 74 70 80 indmin 3 4

i V 0 5 1 8 i 2 3 4 5 6 7 8

i V 0 5 1 8 i 2 3 4 5 6 7 8 9 16 72 45 67 95 74 70 80 indmin 3 E assim por diante, até que o vetor fique ordenado

A função Selection. Sort: void Selection. Sort (int n, vetor V) { int i,

A função Selection. Sort: void Selection. Sort (int n, vetor V) { int i, j, indmin; for (i = 0; i < n-1; i++) { indmin = i; for (j = i+1; j <= n-1; j++) if (V[j] < V[indmin]) indmin = j; se (indmin != i) Trocar (&V[i], &V[indmin]); } Só ocorre movimentação } de elementos quando o índice do menor for encontrado