Ordenação Interna - sistemas.riopomba.ifsudestemg.edu.br · –Ordenação in-place, requer um...
Transcript of Ordenação Interna - sistemas.riopomba.ifsudestemg.edu.br · –Ordenação in-place, requer um...
Ordenação Interna
Quick sort
– Paradigma divisão e conquista;
– Tempo de execução no pior caso é Θ(n²);
– Tempo esperado é Θ(n log n);
– Constante da notação é pequena;
– Ordenação in-place, requer um número de memória fora da estrutura de dados.
Seguir
Cap4 - Ordenação - Seção 4.1.1 - Livro Projeto de Algoritmos
Disponível no DCC
Vetor a ser utilizado:
4 3 1 5 7 6
Princípio - Quick sort
Para ordenar um vetor 𝐴 𝑒𝑠𝑞 …𝑑𝑖𝑟 :
- Divisão: o vetor é particionado em “dois subvetores” não-vazios, 𝐴 𝑒𝑠𝑞 …𝑚𝑒𝑖 e 𝐴 𝑚𝑒𝑖 + 1…𝑑𝑖𝑟 :- 𝐴 𝑒𝑠𝑞 …𝑚𝑒𝑖 valores menores ou igual ao pivô;
- 𝐴 𝑚𝑒𝑖 + 1…𝑑𝑖𝑟 valores maiores ao pivô;
- Conquista: os “dois subvetores” são ordenados por chamadas recursivas a quicksort;
Código – Quick sort
Quicksort(A,esq,dir)
if esq < dir then
mei = particiona(A,esq,dir)
quicksort(A,esq,mei)
quicksort(A,mei + 1 ,dir)
Chamada Inicial: quicksort(A, 1, n)
Código – Partição
Particiona(A, esq, dir)
x = A[dir] //x é o pivô
i = esq – 1
for j = esq até dir - 1 do
if A[j] menor ou igual a x faça
i = i+ 1
A[i] ↔ A[j]
A[i+1] ↔ A[dir]
Devolve i + 1 //posição do pivô
Problema
Rearranjar um dado vetor 𝐴 𝑒𝑠𝑞 …𝑑𝑖𝑟 e devolver
um índice 𝑚𝑒𝑖, 𝑒𝑠𝑞 ≤ 𝑚𝑒𝑖 < 𝑑𝑖𝑟, tais que:
𝐴 𝑒𝑠𝑞 …𝑚𝑒𝑖 − 1 ≤ 𝐴 𝑚𝑒𝑖 < 𝐴[𝑚𝑒𝑖 + 1…𝑑𝑖𝑟]
Entra:
Sai:
esq mei dir
A 18 20 20 99 52 42 40 60 98 88
esq mei dir
A 88 42 52 99 20 20 40 60 98 18
particiona(A, esq, dir)Pivô: 88
esq dir
A 18 42 52 99 20 20 40 60 98 88
↑ ↑
esq dir
A 18 42 52 99 20 20 40 60 88 98
↑ ↑esq dir
A 18 42 52 99 20 20 40 60 88 98
↑ ↑esq dir
A 18 42 52 99 20 20 40 60 88 98
↑ ↑
particiona(A,esq,dir)
esq mei dir
A 18 20 20 99 52 42 40 60 98 88
esq mei dir
A 18 20 52 99 20 42 40 60 98 88
↑ ↑
esq mei dir
A 18 20 52 99 20 42 40 60 98 88
↑ ↑
Análise - particiona(A,esq,dir)
– O algoritmo particiona consome tempo Θ(n);
– O laço interno do procedimento particiona é extremamente simples;
– Razão pela qual o algoritmo quicksort é tão rápido.
quicksort(A, 1, 3)
esq mei dir
A 18 20 20 99 52 42 40 60 98 88
↑ ↑
esq mei dir
A 18 20 20 99 52 42 40 60 98 88
↑ ↑
esq mei dir
A 18 20 20 99 52 42 40 60 98 88
quicksort(A, 4, n)
esq mei dir
A 18 20 20 40 52 42 99 60 98 88
↑ ↑esq mei dir
A 18 20 20 40 52 42 99 60 98 88
↑ ↑esq mei dir
A 18 20 20 40 52 42 99 60 98 88
↑ ↑esq mei dir
A 18 20 20 40 52 42 60 99 98 88
↑ ↑
quicksort(A, 3, 6)
esq mei dir
A 18 20 20 40 52 42 60 99 98 88
↑ ↑
esq mei dir
A 18 20 20 40 52 42 60 99 98 88
↑ ↑
esq mei dir
A 18 20 20 40 42 52 60 99 98 88
↑ ↑
quicksort(A, 7, n)
esq mei dir
A 18 20 20 40 42 52 60 99 98 88
↑ ↑
esq mei dir
A 18 20 20 40 42 52 60 88 98 99
↑ ↑
A 18 20 20 40 42 52 60 88 98 99
Quick sort- Análise– Seja C(n) a função que conta o número de comparações.
– Pior caso: C(n) = O(n²);
– O pior caso ocorre quando, sistematicamente, o pivô é escolhido como sendo um dos extremos de um arquivo já ordenado;
– Isto faz com que o procedimento seja chamado recursivamente n vezes, eliminando apenas um item em cada chamada.
– O pior caso pode ser evitado empregando pequenas modificações no algoritmo:
– Para isso basta escolher três itens quaisquer do vetor e usar a mediana dos três como pivô.
Vantagens
– É extremamente eficiente para ordenar arquivos de dados;
– Necessita de apenas uma pequena pilha como memória auxiliar;
– Requer cerca de n log n comparações em média para ordenar n itens.
Desvantagens
‒ Tem um pior caso O(n²) comparações.
‒ Sua implementação é muito delicada e difícil:‒ Um pequeno engano pode levar a efeitos inesperados
para algumas entradas de dados.
‒ O método não é estável.
Atividade
• Implementar o Quick sort convencional, usando amediana e a média, na escolha do pivô;