Algoritmos de Ordenação

29
Algoritmos de Ordenação No nosso dia-a-dia, com freqüência, nos ocorre de termos de procurar dados em listas ou tabelas. Quando estes dados nos são apresentados de forma desordenada, nosso trabalho é muito mais difícil do que se eles estivessem previamente classificados ou ordenados. Por isso, estudaremos os principais algoritmos para ordenação ou classificação de dados.

Transcript of Algoritmos de Ordenação

Page 1: Algoritmos de Ordenação

Algoritmos de OrdenaçãoNo nosso dia-a-dia, com freqüência, nos ocorre de termos de procurar dados em listas ou tabelas. Quando estes dados nos são apresentados de forma desordenada, nosso trabalho é muito mais difícil do que se eles estivessem previamente classificados ou ordenados. Por isso, estudaremos os principais algoritmos para ordenação ou classificação de dados.

Page 2: Algoritmos de Ordenação

Algoritmos de Ordenação1. Ordenação por Seleção

2. Ordenação por Inserção

3. Ordenação por troça

a. Método da Bolha (Bubble Sort)

b. Método de Divisão e Troca (Quick Sort)

Page 3: Algoritmos de Ordenação

ORDENAÇÃO INTERNA

MÉTODOS SIMPLES OU DIRETOS

Page 4: Algoritmos de Ordenação

1.Ordenação por Seleção

O método da ordenação por seleção consiste em ordenar os elementos de uma lista seguindo-se os seguintes passos:

Escolhe-se o menor elemento do vetor e troca-se com o primeiro elemento. Dos elementos restantes, seleciona-se o de mais baixo valor e troca-se com o segundo. E assim por diante, até que o vetor esteja todo ordenado.

Este algoritmo somente deve ser utilizado para classificar listas pequenas, pois é muito ineficiente.

Algoritmos de Ordenação

Page 5: Algoritmos de Ordenação

Ordenação por Seleção DiretaAO R D E N

62 3 4 51

i = 1 OA R D E N

OA D R E Ni = 2

OA D E R Ni = 3

OA D E N Ri = 4

RA D E N Oi = 5

Chaves Iniciais

Page 6: Algoritmos de Ordenação

VARIÁVEISVetor : VETOR[0..10] DE INTEIROi : INTEIROPROCEDIMENTO SELECAO (vetor:VETOR DE INTEIRO, tamanho: INTEIRO)VARIÁVEISi, j, menor : INTEIROx : elemento da listaINÍCIO PARA i DE 1 ATÉ tamanho-1 FAÇA menor i PARA j DE i+1 ATÉ TAMANHO FAÇA SE vetor [j] < vetor [menor] FAÇA menor j FIMPARA x vetor [menor] vetor [menor] vetor [i] vetor [i] x FIMPARAFIM

Algoritmos de Ordenação

Page 7: Algoritmos de Ordenação

INÍCIO

PARA i DE 1 ATÉ 10 FAÇA

LEIA vetor [i]

FIMPARA

SELECAO (vetor, 10)

PARA i DE 1 ATÉ 10 FAÇA

ESCREVA vetor [i]

FIMPARA

FIM

Algoritmos de Ordenação

Page 8: Algoritmos de Ordenação

1.Ordenação por Inserção

Inicialmente, considara-se o primeiro elemento ordenado. O segundo elemento é, então, inserido na sua posição correta em relação ao primeiro, resultando as duas primeiras posições ordenadas. A seguir, o terceiro elemento é inserido na sua posição correta em relação aos dois primeiros, resultando nas três primeiras posições ordenadas. E assim sucessivamente. Ao inserir cada novo elemento, deslocamentos são feitos, se necessários.

Obs: O tempo de execução desse método cresce exponencialmente em relação ao tamanho da tabela. Todavia, tem comportamento natural, isto é, é bom para listas quase ordenadas.

Algoritmos de Ordenação

Page 9: Algoritmos de Ordenação

AO O R E N OD O R E Ni = 3

Ordenação por InserçãoAO R D E N

62 3 4 51

i = 2 AO R D E N

AD E O R Ni = 4

AD E N O Ri = 5

RA D E N Oi = 6

Chaves Iniciais O R

Page 10: Algoritmos de Ordenação

VARIÁVEIS

Vetor : VETOR[1..10] DE INTEIRO

i, j, chave : INTEIRO

INÍCIO

PARA i DE 1 ATÉ 10 FAÇA

LEIA vetor [i]

FIMPARA

PARA j DE 2 ATÉ 10 FAÇA

chave vetor [j]

i j - 1

ENQUANTO ( i > 0 ) E (vetor[i] > chave ) FAÇA

vetor [i + 1] vetor [i]

i i - 1

FIMENQUANTO

VETOR [i + 1] chave

FIMPARA

FIM

Algoritmos de Ordenação

Page 11: Algoritmos de Ordenação

Algoritmo da bolha - Bubble Sort

• Idéia básica– Troca pares de elementos adjacentes que estão fora

de ordem– Faz múltiplas passagens pelo array até que as trocas

não sejam mais necessárias– Invariante

•A cada passagem coloca o maior elemento na posição correta, a última posição para aquela passagem

Obs: Esse método é um dos mais conhecidos e simples, mas um dos piores.

Page 12: Algoritmos de Ordenação

Algoritmo da bolha: execução12 8 3 21 99 1 início

8 12 3 21 99 1 Compara, troca (1, 2)

8 3 12 21 99 1 Compara, troca (2, 3)

8 3 12 21 99 1 Compara, não troca

8 3 12 21 99 1 Compara, não troca

8 3 12 21 1 99 Compara, troca (5, 6)

8 3 12 21 1 99 maior na posição final

Page 13: Algoritmos de Ordenação

Algoritmo da bolha: execução (cont.)

8 3 12 21 1 99 Passo 2

3 8 12 21 1 99 troca (1, 2)

3 8 12 21 1 99 não troca

3 8 12 21 1 99 não troca

3 8 12 1 21 99 troca (4, 5)

3 8 12 1 21 99 21 na posição

Page 14: Algoritmos de Ordenação

Algoritmo da bolha: execução (cont.)3 8 12 1 21 99 Passo 3

3 8 12 1 21 99 não troca

3 8 12 1 21 99 não troca

3 8 1 12 21 99 não troca

3 8 1 12 21 99 troca (3, 4)

3 1 8 12 21 99 troca (2, 3)

1 3 8 12 21 99 troca (1, 2)

3 8 1 12 21 99 12 na posição; passo 4

3 1 8 12 21 99 8 na posição; passo 5

1 3 8 12 21 99 FEITO

Page 15: Algoritmos de Ordenação

VARIÁVEIS

Vetor : VETOR[1..10] DE INTEIRO

i : INTEIRO

PROCEDIMENTO bublesort (vetor:VETORDE INTEIRO, tamanho: INTEIRO)

VARIÁVEIS

i, j, temp : INTEIRO

INÍCIO

PARA i DE 1 ATÉ tamanho FAÇA

PARA j DE 1 ATÉ TAMANHO-1 FAÇA

SE vetor [j] > vetor [j+1] FAÇA

temp vetor [j]

vetor [J] vetor [j+1]

vetor [j+1] temp

FIMSE

FIMPARA

FIMPARA

FIM

Algoritmos de Ordenação

Page 16: Algoritmos de Ordenação

INÍCIO

PARA i DE 1 ATÉ 10 FAÇA

LEIA vetor [i]

FIMPARA

bublesort (vetor, 10)

PARA i DE 1 ATÉ 10 FAÇA

ESCREVA vetor [i]

FIMPARA

FIM

Algoritmos de Ordenação

Page 17: Algoritmos de Ordenação

Algoritmo da bolha: uso

• quando se dispõe de uma quantidade de tempo enorme...– em situações reais, é duas vezes mais lento do que

os algoritmos de inserção direta e seleção direta– última escolha...

Page 18: Algoritmos de Ordenação

ORDENAÇÃO INTERNA

MÉTODOS SOFISTICADOS OU EFICIENTES

Page 19: Algoritmos de Ordenação

Ordenação por Particionamento ou Quicksort

• O Quicksort é o algoritmo mais rápido para ordenação interna já conhecido, sendo por isso o mais utilizado entre todos os algoritmos de ordenação para uma grande quantidade de situações.

• Princípio1. Dividir o problema de ordenar um conjunto de n itens

em dois problemas menores2. Ordenar independentemente os problemas menores3. Combinar os resultados para produzir a solução do

problema maior

Page 20: Algoritmos de Ordenação

Partição

• O procedimento de partição é uma parte complicada do método:– Deve-se rearranjar o vetor na forma A[Esq..Dir]

através da escolha arbitrária de um item x do vetor chamado pivô

– Ao final, o vetor A deverá ter duas partes, uma esquerda com chaves menores ou iguais que x e a direita com valores de chaves maiores ou iguais que x

Page 21: Algoritmos de Ordenação

Algoritmo Quicksort: Partição1. Escolher arbitrariamente um item do vetor e colocar

este valor em x

2. Percorrer o vetor a partir da esquerda até que um item A[i] x é encontrado; da mesma maneira, percorrer o vetor a partir da direita até que um item A[j] x é encontrado;

3. Como os itens A[i] e A[j] não estão na ordem correta no vetor final, eles devem ser trocados

4. Continuar o processo até que os índice i e j se cruzem em algum ponto do vetor

Page 22: Algoritmos de Ordenação

Funcionamento do Quicksort: Partição

• Ao final do processo, o vetor A[Esq..Dir] está particionado de tal forma que:– Os itens em A[Esq], A[Esq+1],..., A[j] são menores

ou iguais a x– Os itens em A[i], A[i+1],..., A[Dir] são maiores ou

iguais a x

Page 23: Algoritmos de Ordenação

Exemplo de Partição

AO R D E N

62 3 4 51

i = 2 OA R D E N

OA D R E Ni = 3

Chaves Iniciais D

• O pivô é escolhido como sendo A[(i+j) div 2]• Inicialmente, i=1 e j=6, e então x=A[3] = D• A varredura a partir da posição 1 pára no item O e a varredura

a partir da posição 6 pára em A, sendo os dois itens trocados• A varredura a partir da posição 2 pára em R e a varredura a

partir da posição 5 pára no item D, e então os dois itens são trocados

• Neste instante i e j se cruzam (i=3 e j=2), o que encerra o processo de partição

Page 24: Algoritmos de Ordenação

Procedimento Ordena

AO R D E N

62 3 4 51

i = 1 OA D R E N

OE R Ni = 3

ON Ri = 4

ROi = 5

Chaves Iniciais

A Di = 2

RA D E N Oi = 6

Page 25: Algoritmos de Ordenação

Procedimento PartiçãoVARIÁVEIS vetor : VETOR[0...10] DE INTEIRO i : INTEIRO PROCEDIMENTO quicksort(variavel vetor : VETOR DE

INTEIRO, primeiro : INTEIRO, último : INTEIRO)VARIÁVEIS menor : INTEIRO maior : INTEIRO separador : INTEIRO temp : INTEIRO INÍCIO menor primeiro maior último separador vetor[(primeiro + último) / 2]

Page 26: Algoritmos de Ordenação

Procedimento PartiçãoREPITA ENQUANTO vetor[menor] < separador FAÇA menor menor + 1 FIMENQUANTO ENQUANTO vetor[maior] > separador FAÇA maior maior - 1 FIMENQUANTO  SE menor <= maior FAÇA temp vetor[menor] vetor[menor] vetor[maior] vetor[maior] temp  menor menor + 1 maior maior - 1 FIMSE ATÉ QUE menor > maior

Page 27: Algoritmos de Ordenação

Procedimento PartiçãoSE primeiro < maior FAÇA quicksort(vetor, primeiro, maior) FIMSE SE menor < último FAÇA quicksort(vetor, menor, último) FIMSEFIMINÍCIO {Programa Principal} PARA i DE 1 ATÉ 10 FAÇA LEIA vetor[i] FIMPARA  quicksort(vetor, 1, 10)  PARA i DE 1 ATÉ 10 FAÇA ESCREVA vetor[i] FIMPARAFIM 

Page 28: Algoritmos de Ordenação

Analisando a procedure

• O vetor é uma variável global ao procedimento Partição

• Obs: note que o laço interno do algoritmo de partição só faz incrementos e decrementos; daí a velocidade do algoritmo

Page 29: Algoritmos de Ordenação

Referências

• Transparências disponibilizadas pelo Prof. Ziviani, a partir do Livro Projeto de Algoritmos com Implementação em Pascal e C, M. A. da Silva Bigonha e Nívio Ziviani, Campus

• Algoritmos e Estruturas de Dados, N. Wirth, Prentice-Hall

• Curso on-line Estrutura de Dados I, USP – São Carlos