Você está na página 1de 56

Aula 1: Algoritmos de Ordenação

Merge Sort e Quick Sort

DCC405-Estrutura de Dados II
Prof. Me. Acauan C. Ribeiro
Qual é o seu problema?

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 2/56


Eternity 2 - Puzzle

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 3/56


Eternity 2 - Puzzle

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 4/56


Eternity 2 - Puzzle

4x4 = 16 peças

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 5/56


Eternity 2 - Puzzle
16 x 16
256 peças
10 x 10
100 peças

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 6/56


Eternity 2 - Puzzle
16 x 16
256 peças
10 x 10
100 peças

1080
Átomos universo
observável

10112
Combinações de
peças Eternity 2

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 7/56


Algorítmos de Ordenação
● Algoritmos de ordenação organizam os elementos de uma lista em uma
ordem (ascendente ou descendente).
● Ordenação é uma das mais importantes categorias de algoritmos da
Computação.
● Frequentemente são usados para diminuir a complexidade de um
problema.
● Aplicam-se em problemas de banco de dados ou de recuperação de
informação.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 8/56


Classificação dos Algoritmos de Ordenação
● Número de comparações
● Número de trocas
● Localização dos dados
– Ordenação interna
● Todos os dados estão em memória principal (RAM).
– Ordenação externa
● Memória principal não cabe todos os dados.
● Dados armazenados em memória secundária (disco).
● Recursão

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 9/56


Classificação dos Algoritmos de Ordenação
● Uso de memória
– In place: ordena sem usar memória adicional ou usando
uma quantidade constante de memória adicional.
– Alguns métodos precisam duplicar os dados.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 10/56


Classificação dos Algoritmos de Ordenação
● Adaptabilidade
– Um método é adaptável quando a sequência de operações realizadas
depende da entrada.
– Um método que sempre realiza as mesmas operações, independente
da entrada, é não adaptável.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 11/56


Classificação dos Algoritmos de Ordenação
● Estabilidade
– Método é estável se a ordem relativa dos registros com a mesma chave não se
altera após a ordenação.
Entrada

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 12/56


Classificação dos Algoritmos de Ordenação
● Estabilidade
– Método é estável se a ordem relativa dos registros com a mesma chave não se
altera após a ordenação. Ordenação
Entrada Não Estável

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 13/56


Classificação dos Algoritmos de Ordenação
● Estabilidade
– Método é estável se a ordem relativa dos registros com a mesma chave não se
altera após a ordenação. Ordenação Ordenação
Entrada Não Estável Estável

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 14/56


→ Abrir pdf Paradigmas-Algoritmos-cap2.pdf

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 15/56


→ Abrir pdf Paradigmas-Algoritmos-cap2.pdf

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 16/56


Exemplo de Indução Matemática

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 17/56


Algoritmos de Divisão e Conquista
A estratégia de dividir e conquistar resolve um problema por:

1. Dividindo-o em subproblemas que são instâncias menores do mesmo tipo de problema


2. Resolvendo recursivamente esses subproblemas
3. Combinando adequadamente suas respostas
O trabalho real é feito aos poucos, em três lugares diferentes: no particionamento de
problemas em subproblemas; no final da recursão, quando os subproblemas são tão
pequenos que eles são resolvidos imediatamente; e na colagem de respostas parciais.
Estes são mantidos juntos e coordenados pela estrutura recursiva central do algoritmo.

Referência: Dasgupta, Papadimitriou and Vazirani, Algorithms, McGraw-Hil, 2006.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 18/56


Algoritmo de Ordenação: Merge Sort

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 19/56


Merge Sort
O algoritmo divide a matriz de entrada em duas metades, chama a si mesmo passando cada metade e,
em seguida, mescla as duas metades classificadas. A função merge() é usada para mesclar duas
metades. O merge(arr, l, m, r) é um processo chave que assume que arr[l..m] e arr[m+1..r] são
ordenados e funde os dois sub-arrays ordenados em um. Veja o pseudocódigo:

MergeSort(arr[], l, r)
Se r > l
1. Encontre o ponto médio para dividir a matriz em duas metades:
meio m = l+ (rl)/2
2. Chame mergeSort para a primeira metade:
Chame mergeSort(arr, l, m)
3. Chame mergeSort para a segunda metade:
Chame mergeSort(arr, m+1, r)
4. Mescle as duas metades classificadas nas etapas 2 e 3:
Chamar mesclagem (arr, l, m, r)

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 20/56


Merge Sort - Exemplo INICIO

Divisão

Conquista

FIM

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 21/56


Merge Sort - Código

Let’s code </>...

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 22/56


Algoritmo de Ordenação: Quick Sort

Livro “Projeto de Algoritmos” – Nívio Ziviani


Capítulo 4 – Seção 4.1.4

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 23/56


Quick Sort
● Proposto por C. A. R. Hoare em 1960 e publicado em 1962.
● É o algoritmo de ordenação interna mais rápido que se conhece para uma ampla
variedade de situações.
● Provavelmente é o mais utilizado.
● A idéia básica é dividir o problema de ordenar um conjunto com n itens em dois
problemas menores.
● Os problemas menores são ordenados independentemente.
● Os resultados são combinados para produzir a solução final.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 24/56


Quick Sort

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 25/56


Quick Sort - Descrição
● O algoritmo Quick Sort é um dos algoritmos de ordenação mais
utilizados. Segue um paradigma de dividir e conquistar.
Geralmente usamos a Recursão na implementação do quicksort.
Em cada chamada recursiva, um pivô é escolhido, então o array
é particionado de tal forma que todos os elementos menores que
pivô ficam à esquerda e todos os elementos maiores que pivô
ficam à direita.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 26/56


Quick Sort - Descrição
● Após cada chamada, o pivô escolhido ocupa sua posição
correta no array, como em um array ordenado. Assim, a
cada etapa, nosso problema é reduzido em 2, o que
leva a uma classificação rápida. O pivô pode ser um
elemento. Exemplo: último elemento do array atual ou o
primeiro elemento do array atual ou pivô aleatório etc.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 27/56


Quick Sort - Pseudocódigo
● Nos é dado um array como entrada
● Escolha pivô, aqui estamos escolhendo o último elemento como nosso pivô
● Agora particione o array de acordo com o pivô
– Mantenha um índice particionado “p” e inicialize-o para -1
– Iterar por todos os elementos da matriz, exceto o pivô (ínidice i)
– Se um elemento for menor que o elemento pivô, incremente p e troque os elementos no índice p pelo elemento no índice i.
– Uma vez que todos os elementos são percorridos, troque o pivô com o elemento presente em p+1, pois essa será a posição final dele no array
ordenado
– Agora retorne o índice do pivô
● Uma vez particionado, agora faça 2 chamadas no quicksort
● Um do início a p-1
● Outros de p+1 a n-1

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 28/56


Quick Sort - Pseudocódigo

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 29/56


Quick Sort - [4, 7, 2, 6, 4, 1, 8, 3]

Exemplo
>> Entrada

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 30/56


Quick Sort - [4, 7, 2, 6, 4, 1, 8, 3]

Exemplo
>> Escolha do
últipo elemento
como pivô

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 31/56


Quick Sort - [4, 7, 2, 6, 4, 1, 8, 3]

Exemplo p i

>> O i vai iterar


todos os
elementos do
array

O p vai marcar os
elementos maiores
e menores que o
pivo

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 32/56


Quick Sort - [4, 7, 2, 6, 4, 1, 8, 3]

Exemplo p i

4 >= 3 .. anda i
>> O i marca o
elemento que está
sendo analisado,
que vai ser
comparado com o
pivô naquele
instante.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 33/56


Quick Sort - [4, 7, 2, 6, 4, 1, 8, 3]

Exemplo p i

4 >= 3 .. anda i
>> O i marca o
elemento que está
sendo analisado,
que vai ser
comparado com o
pivô naquele
instante.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 34/56


Quick Sort - [4, 7, 2, 6, 4, 1, 8, 3]

Exemplo p i

7 >= 3 .. anda i
>> O i marca o
elemento que está
sendo analisado,
que vai ser
comparado com o
pivô naquele
instante.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 35/56


Quick Sort - [4, 7, 2, 6, 4, 1, 8, 3]

Exemplo p i

7 >= 3 .. anda i
>> O i marca o
elemento que está
sendo analisado,
que vai ser
comparado com o
pivô naquele
instante.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 36/56


Quick Sort - [4, 7, 2, 6, 4, 1, 8, 3]

Exemplo p i

2 >= 3 .. menor!
>> O i marca o Troca arr[i] com arr[p]
elemento que está
sendo analisado,
que vai ser
comparado com o
pivô naquele
instante.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 37/56


Quick Sort - [2, 7, 4, 6, 4, 1, 8, 3]

Exemplo p i

2 >= 3 .. menor!
>> O i marca o Troca arr[i] com arr[p]
elemento que está
sendo analisado, anda p e i (i anda
que vai ser sempre)
comparado com o
pivô naquele
instante.

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 38/56


Quick Sort - [2, 7, 4, 6, 4, 1, 8, 3]

Exemplo p i

>> Nesta disposição o


indices p e i que de
controle, demarcam o
elementos antes do p são
MENORES que o pivô e os
elementos entre o p e o i
são maiores

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 39/56


Quick Sort - [2, 7, 4, 6, 4, 1, 8, 3]

Exemplo p i

>> Nesta disposição o


indices p e i que de
controle, demarcam o
elementos antes do p são
MENORES que o pivô e os
elementos entre o p e o i
são maiores

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 40/56


Quick Sort - [2, 7, 4, 6, 4, 1, 8, 3]

Exemplo p i

>> Nesta disposição o


indices p e i que de
controle, demarcam o
elementos antes do p são
MENORES que o pivô e os
elementos entre o p e o i
são maiores

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 41/56


Quick Sort - [2, 7, 4, 6, 4, 1, 8, 3]

Exemplo p i

>> Nesta disposição o Tro ca arr[i] com arr[p]


indices p e i que de anda p e i (i anda sempre)
controle, demarcam o
elementos antes do p são
MENORES que o pivô e os
elementos entre o p e o i
são maiores

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 42/56


Quick Sort - [2, 1, 4, 6, 4, 7, 8, 3]

Exemplo p i

>> Nesta disposição o


indices p e i que de
controle, demarcam o
elementos antes do p são
MENORES que o pivô e os
elementos entre o p e o i
são maiores

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 43/56


Quick Sort - [2, 1, 4, 6, 4, 7, 8, 3]

Exemplo p i

>> Nesta disposição o Indice i che gou ao pivô,


indices p e i que de prova arr[p] com arr[pivot]
controle, demarcam o
elementos antes do p são
MENORES que o pivô e os
elementos entre o p e o i
são maiores

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 44/56


Quick Sort - [2, 1, 3, 6, 4, 7, 8, 4]

Exemplo p i

>> Nesta disposição o Indice i che gou ao pivô,


indices p e i que de prova arr[p] com arr[pivot]
controle, demarcam o
elementos antes do p são
MENORES que o pivô e os
elementos entre o p e o i
são maiores

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 45/56


Quick Sort - [2, 1, 3, 6, 4, 7, 8, 4]

Exemplo Menores que o pivô Maiores que o pivô

>> Nesta disposição o


indices p e i que de Chama a função Quicksort para essas
duas partes do array, os menores e os
controle, demarcam o maiores que o pivô.
elementos antes do p são Quicksort(0..pivot)
MENORES que o pivô e os Quicksort(pivot+1..n)

elementos entre o p e o i
são maiores

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 46/56


Quick Sort - Implementação

Let’s code </>...

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 47/56


Quick Sort

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 48/56


Quick Sort

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 49/56


Quick Sort

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 50/56


DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 51/56
Quick Sort

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 52/56


Quick Sort - Melhorias

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 53/56


Comparação Quick x Merge

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 54/56


Quick Sort - Exercício

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 55/56


Referências
● Algorithms in a Nutshell. George T. Heineman, Gary Pollice, Stanley Selkow. O’Reilly
Media, 2009.
● Projetos de Algoritmos – com implementações em Pascal e C. Nivio Ziviani. 2a edição.
Thomson, 2005.
● Algoritmos: teoria e prática. CORMEN, Thomas H. et al. Rio de Janeiro: Elsevier, 2002.
ISBN 9788535236996.
● Canal Programação Dinâmica
● https://www.mygreatlearning.com/blog/quick-sort-algorithm/

DCC405-Estrutura de Dados II | Alg. Ordenação - Merge e Quick Sort 56/56

Você também pode gostar