estruturas de dados - cic/unbalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · algoritmos de...

31
Estruturas de Dados Algoritmos de Ordenação Prof. Eduardo Alchieri

Upload: others

Post on 13-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Estruturas de Dados

Algoritmos de Ordenação

Prof. Eduardo Alchieri

Page 2: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(introdução)

Considere uma sequência arbitrária S = {s1, s2, s3,...sn} composta por n ≥ 0 elementos retirados do conjunto universo U

O objetivo da ordenação é arrumar os elementos de S para produzir uma nova sequência S' na qual os elementos de S estão em ordem

O que significa os elementos estarem em ordem? Para qualquer dois elementos i, j extraídos de U

i < j; i = j; i > j A relação < é transitiva

Ordenar os elementos de S é definir uma permutação dos elementos de S para produzir S' de acordo com o operador “<”

Em outras palavras, ordenar é o processo de organizar um conjunto de elementos em uma ordem

Page 3: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(introdução)

Exemplos:

lista telefônica, com os nomes das pessoas em ordem alfabética

bancos, com os atendimentos por ordem de chegada

hospitais, com os atendimentos em ordem de prioridade

times, com os jogadores em ordem de técnica

etc.

Page 4: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(introdução)

A ordenação visa facilitar a recuperação de um item do conjunto

Busca binária: sabendo que o objeto está em um intervalo e com uma função de teste que diz se o objeto está antes, em ou depois de uma determinada posição, a busca binária divide a quantidade de números que precisam ser vericados pela metade a cada iteração

O(log n)

Page 5: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(introdução)

Algoritmos de ordenação trabalham sobre a chave de ordenação de um registro (claro, podem existir outros dados no registro)

Nome Matrícula Id Código Etc

Chave de ordenação é qualquer tipo de chave sobre a qual exista uma regra de ordenação bem definida

Page 6: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(introdução)

Os métodos de ordenação podem ser de dois tipos:

Estáveis: as chaves duplicadas mantém suas posições relativas na sequência ordenada

Instáveis: as chaves duplicadas não mantém suas posições relativas na sequência ordenada

Alguns métodos de ordenação mais eficientes são instáveis, mas estabilidade pode ser forçada

Page 7: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(métodos de ordenação)

Método Ineficiente

Bogosort: O (∞) Métodos elementares:

Inserção: O(n2) Bubblesort: O(n2)

Seleção: O(n2) Métodos Eficientes

Quicksort: O(n log n) (no pior caso é O(n2)) Heapsort: O(n log n) Mergesort: O(n log n) Counting Sort: O(n)

Page 8: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(métodos de ordenação)

Uma outra classificação:

Ordenação por inserção

Inserção Ordenação por troca

Bubblesort Quicksort

Ordenação por seleção

Seleção Heapsort

Ordenação por fusão

Mergesort Ordenação por distribuição

Counting Sort

Page 9: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(Bogosort)

Algoritmo é probabilístico

Pode nunca terminar

Page 10: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(inserção)

A ideia é separar a lista em duas: a primeira ordenada e a segunda aleatoria

1. Para o segundo item em diante, selecione o i-esimo item.

2.Coloque-o no na parte ordenada, na posição correta.

Page 11: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(inserção)

Algoritmo

Exemplo de funcionamento

Page 12: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(inserção)

O número mínimo de comparações e movimentos ocorre quando os itens estão originalmente em ordem

Melhor caso: O(n) O número máximo ocorre quando os itens estão originalmente

na ordem reversa

Pior caso: O(n2) Deve ser utilizado quando a lista esta ”quase" ordenada

Caso medio : O(n2) (com função de custo menor que o pior caso)

E um bom método quando se deseja adicionar uns poucos itens a uma lista ordenada, pois o custo e linear

O algoritmo de ordenação por inserção é estável

Page 13: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(bubblesort)

A ideia principal do algoritmo é percorrer a lista n − 1 vezes, a cada passagem fazendo flutuar para o final o maior elemento da sequência (pode ser o contrário).

O bubblesort é estável

Algoritmo

bubble(int[] v, int n){

for(int i = n; i > 1; --i){

for(int j = 0; j < i – 1; ++j){

if(v[ j ] > v [ j + 1]){

troca(j, j + 1)

}

}

}

}

Page 14: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(bubblesort)

Exemplo

3 1 4 1 5 9 2 6 5 4

i=10 1 3 1 4 5 2 6 5 4 9

i=9 1 1 3 4 2 5 5 4 6 9

i=8 1 1 3 2 4 5 4 5 6 9

i=7 1 1 2 3 4 4 5 5 6 9

i=6 1 1 2 3 4 4 5 5 6 9

i=5 1 1 2 3 4 4 5 5 6 9

i=4 1 1 2 3 4 4 5 5 6 9

i=3 1 1 2 3 4 4 5 5 6 9

i=2 1 1 2 3 4 4 5 5 6 9

Page 15: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(bubblesort)

Otimização (código em java)public static void bubbleSort (int [] vetor){

boolean houveTroca = true;

while (houveTroca) {

houveTroca = false;

for (int i = 0; i < (vetor.length)-1; i++){

if (vetor[i] > vetor[i+1]){

int variavelAuxiliar = vetor[i+1];

vetor[i+1] = vetor[i];

vetor[i] = variavelAuxiliar;

houveTroca = true;

}

}

}

}

Page 16: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(seleção)

A ideia é encontrar o menor elemento do vetor e posicioná-lo corretamente

Algoritmo

Page 17: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(seleção)

Exemplo

Animação

Page 18: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(seleção)

Page 19: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(quicksort)

Proposto por Charles Hoare em 1960.

É o algoritmo de ordenação mais rápido que se conhece para uma ampla variedade de situações

Provavelmente é o mais utilizado

Não é estável

A ideia básica é dividir o problema de ordenar um conjunto com n itens em dois problemas menores (dividir para conquistar)

Os problemas menores são ordenados independentemente Os resultados são combinados para produzir a solução final

Page 20: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(quicksort)

Passos do algoritmo

1. Escolher o elemento pivô

● Ponto fundamental do algoritmo

2. Reordenar a lista de acordo com o pivô

● Neste ponto, o pivô estará na sua posição final (ordenado)

3. Reaodenar recursivamente as sub-listas com elementos menores/maiores que o pivô

Page 21: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(quicksort)

Page 22: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(quicksort)

A escolha do pivô é um ponto fundamental do algoritmo

Pior caso: o pivô escolhido é sempre um extremo do arquivo Caso médio: ocorre quando cada partição divide o arquivo

em duas partes iguais Várias formas de escolher o pivô:

Pegar o primeiro elemento Pegar o último elemento Média entre o primeiro e último elemento Média entre três elementos

Page 23: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(heapsort)

Possui o mesmo princípio de funcionamento da ordenação por seleção e também não é estável

Utiliza uma estrutura de dados chamada heap para ordenar os elementos a medida que os insere na estrutura

Ao final das inserções, os elementos podem ser sucessivamente removidos da raiz da heap, na ordem desejada

A heap pode ser representada como uma árvore ou como um vetor

O custo para inserir ou remover um elemento da heap é O(log n)

Page 24: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(heapsort)

Page 25: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(mergesort)

Usa a estratégia de dividir para conquistar

É mais rápido ordenar vetores menores que maiores É mais rápido unir dois vetores ordenados do que dois não

ordenados Passos do algoritmo

1.Se o tamanho da lista for 0 ou 1, já está ordenada

2.Dividir a lista em duas partes (de mesmo tamanho)

3.Ordenar cada sub-lista recursivamente

4.Combinar as sub-listas (em ordem)

Page 26: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(mergesort)

Page 27: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(mergesort)

Page 28: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(counting sort)

Assume-se que as chaves que serão ordenadas estão uniformemente distribuídas em um intervalo conhecido(por exemplo, de 1 a m).

É um algoritmo estável.

Passos do algoritmo

Inicialize um vetor de contadores, inicialmente em zero Percorra o vetor original, incrementando os contadores dos

elementos encontrados Coloque os elementos no vetor original, de acordo com os

contadores

Page 29: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(counting sort)

Algoritmo

bucketsort(int[] v){

for(int i = 0; i < m; ++i){ //m é o número de contadores

contador[i] = 0;

}

for(int j = 0; j < n; ++i){ //n é o tamanho de v

contador[v[j]]++;

}

j = 0;

for(int i = 0; i < m; ++i){

while(contador[i] > 0){

contador[i]--; v[j++] = i;

}

}

}

Page 30: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(bucketsort)

O tempo total de processamento é O(m+n) Se n = m, então o custo fica O(n)

Porém, consome mais memória É necessário um espaço de O(m) para o vetor de

contadores

Page 31: Estruturas de Dados - CIC/UnBalchieri/disciplinas/graduacao/ed/... · 2015. 3. 9. · Algoritmos de Ordenação (introdução) Considere uma sequência arbitrária S = {s1, s2, s3,...sn}

Algoritmos de Ordenação(demonstrações)