You are on page 1of 48

Algoritmos de 

Ordenação e Busca

Me. Fabianni Roberto Teles
Ordenação (Conceitos iniciais)
• Definição:  Ordenar  corresponde  ao  processo  de 
rearranjar  um  conjunto  de  objetos  em  uma  ordem 
ascendente ou descendente.
• O  objetivo  principal  da  ordenação  é  facilitar  a 
recuperação posterior de itens do conjunto ordenado, ou 
seja,  REDUZIR  O  CUSTO  DA  EXECUÇÃO  DO 
ALGORITMO.
• Imagine  como  seria  difícil  efetuar  uma  busca  de  uma 
chave  numérica  se  os  valores  não  estivessem  listados 
em  ordem.  A  atividade  de  colocar  as  coisas  em  ordem 
está presente na maioria das aplicações onde os objetos 
armazenados  têm  que  ser  pesquisados  e  recuperados, 
tais como banco de dados, tabelas, arquivos e índices de 
forma geral.
• Qual é o melhor algoritmo? Compensa ordenar? CUSTO 
é importante?
Várias opções de algoritmos...
CUSTO
Outras justificativas

• Os  algoritmos  de  ordenação  constituem  bons 


exemplos  de  como  resolver  problemas  utilizando 
computadores.  As  técnicas  de  ordenação  permitem 
apresentar  um  conjunto  amplo  de  algoritmos 
distintos para resolver uma mesma tarefa.
• Dependendo  da  aplicação,  cada  algoritmo 
considerado  possui  uma  vantagem  particular  sobre 
os  outros.  Além  disso,  os  algoritmos  ilustram 
muitas  regras  básicas  para  manipulação  de 
estruturas de dados.
Os algoritmos trabalham sobre os registros de 
um  arquivo.  Apenas  uma  parte  do  registro, 
chamada chave,  é utilizada para controlar a 
ordenação.  Além  da  chave,  podem  existir 
outros componentes em um registro, os quais 
não têm influência no processo de ordenar, a 
não  ser  pelo  fato  de  que  permanecem  com a 
mesma chave.
Chaves
• A comparação é feita através de uma determinada chave escolhida
• Os registros são usados para representar os elementos a serem 
ordenados

 TipoItem = record
chave: TipoChave;
{outras declarações desejadas...}

end;
Ordenação Interna x Externa

• Os  métodos  de  ordenação  são  classificados  em  dois 


grandes grupos. Se o arquivo a ser ordenado cabe todo 
na memória principal, então o método de ordenação é 
chamado  de  ordenação  interna.  Neste  caso,  o 
número  de  registros  a  ser  ordenado  é  pequeno  o 
bastante para caber em um  array do programa. Se o 
arquivo  a  ser  ordenado  não  cabe  na  memória 
principal  e,  por  isso,  tem  que  ser  armazenado  em 
disco,  então,  o  método  de  ordenação  é  chamado  de 
ordenação  externa.  A  principal  diferença  entre  os 
dois  métodos  é  que,  em  um  método  de  ordenação 
interna,  qualquer  registro  pode  ser  imediatamente 
acessado,  enquanto  em  um  método  de  ordenação 
externa,  os  registros  são  acessados  sequencialmente 
ou em grandes blocos.
• O  aspecto  predominante  na  escolha  de 
um  algoritmo  de  ordenação  é  o  tempo 
gasto  para  ordenar  um  arquivo.  Para 
algoritmos  de  ordenação  interna,  as 
medidas  de  complexidade  relevantes 
contam  o  número  de  comparações  entre 
chaves  e  o  número  de  movimentações 
(ou trocas) de itens do arquivo.
• A quantidade extra de memória utilizada pelo 
algoritmo  é  também  um  aspecto  importante. 
O uso econômico da memória disponível é um 
requisito primordial na ordenação interna. 
Ordenação Interna
Ordenação Interna
• Medidas de complexidade levam em conta:
 O número de comparação entre as chaves
 O número de trocas entre os itens
• São classificados em dois tipos:
 Métodos Simples: mais recomendados para conjuntos 
pequenos de dados. Usam mais comparações, mas 
produzem códigos menores e mais simples;
 Métodos Eficientes ou Sofisticados: adequados para 
conjuntos maiores de dados. Usam menos 
comparações, porém, produzem códigos mais 
complexos e com muitos detalhes.
MAIS UMA VEZ, CUSTO:

• Os  métodos  simples  são  adequados  para  pequenos 


arquivos  e  requerem  0(n2)  comparações,  enquanto  os 
métodos  eficientes  são  adequados  para  arquivos 
maiores e requerem 0 (n log n) comparações.
Alguns Algoritmos de 
Ordenação Interna

• Ordenação por Seleção (Selection Sort)
Métodos 
• Ordenação por Inserção (Insertion Sort) Simples

• Ordenação por Seleção e Troca (Bubble Sort)

• Ordenação por Inserção através de incrementos 
Métodos 
decrescentes (ShellSort) Eficientes
• Ordenação por Particionamento (QuickSort)

• Ordenação de Árvores (HeapSort)
Ordenação Interna

EXEMPLOS
Ordenação por Seleção 

(Selection Sort)
• Um dos algoritmos mais simples.
• Mais  recomendado  para  conjuntos 
pequenos.
• Procedimento:
 Selecione  o  menor  item  do  conjunto  e  troque­o 
com o item que está na posição i.
 Repita  essas  operações  com  os  demais  itens  até 
que reste apenas um elemento.
Ordenação por seleção

O selection sort, ou ordenação por seleção, é um algoritmo de


ordenação baseado em se passar sempre o menor valor do
vetor para a primeira posição (ou o maior dependendo da
ordem requerida), depois o de segundo menor valor para a
segunda posição, e assim é feito sucessivamente com os (n-1)
elementos restantes, até os últimos dois valores.

 Ou seja: selecione o menor item do vetor e a seguir troque-o com o


item que está na primeira posição do vetor. Repita estas duas
operações com os n — 1 itens restantes, depois com os n— 2 itens, até
que reste apenas um elemento.
Foco é importante
EXERCÍCIOS INTRODUTÓRIOS:
1) Qual o melhor e o pior caso? Qual a diferença entre eles no código?
2) Quando a linha “X=V[I]; V[I]=[MIN]; V[MIN]=X” é executada?
3) Qual a função da variável X?
4) Qual a função de cada loop FOR?
Ordenação por inserção

Algoritmo eficiente para ordenar um


pequeno número de elementos
Funcionamento:

• Insertion  sort,  ou  ordenação  por  inserção,  é 


um  simples  algoritmo  de  ordenação,  eficiente 
quando  aplicado  a  um  pequeno  número  de 
elementos. Em termos gerais, ele percorre um 
vetor de elementos da esquerda para a direita 
e,  à  medida  que  avança,  vai  deixando  os 
elementos  mais  à  esquerda  ordenados.  O 
algoritmo  de  inserção  funciona  da  mesma 
maneira  com  que  muitas  pessoas  ordenam 
cartas em um jogo de baralho, como o pôquer.
Neste  método,  a  sequência  a  ser  ordenada  é  varrida  a 
partir da posição 2, e cada item apanhado na sequência é 
inserido  no  seu  lugar  apropriado  em  relação  aos  itens 
anteriores da sequência;

  A  colocação  do  item  no  seu  lugar  apropriado  na 


sequência  destino  é  realizada  movendo­se  os  itens  com 
chaves maiores para a direita e, então, inserindo o item 
na posição deixada vazia.
EXERCÍCIOS:

1) A posição dos registros no vetor influencia em seu funcionamento? Caso sim, qual o
melhor e pior caso?
2) Quando a linha V[i+1] = chave é executada?
OBSERVAÇÕES
O  número  mínimo  de  comparações  e  movimentos  ocorre  quando  os 
itens  estão  originalmente  em  ordem,  e  o  número  máximo  ocorre 
quando os itens estão originalmente na ordem reversa.
Para  arquivos  já  ordenados,  o algoritmo  descobre, a um custo  0(n), 
que cada item já está no seu lugar. Logo, o método da inserção é o 
método a ser utilizado quando o arquivo está "quase" ordenado. E 
também  um  bom  método  quando  se  deseja  adicionar  uns  poucos 
itens  a  um  arquivo  já  ordenado  e  depois  obter  um  outro  arquivo 
ordenado: neste caso o custo é linear.
O algoritmo de ordenação por inserção é quase tão simples quanto o 
algoritmo  de  ordenação  por  seleção.  Além  disso,  o  método  de 
ordenação  por  inserção  é  estável,  pois  ele  deixa  os  registros  com 
chaves iguais na mesma posição relativa.
<>
CUSTO
• Menor número de trocas e comparações entre os algoritmos 
de ordenação Ω(n) quando o vetor está ordenado. 
• Pior caso Θ(n2) 
• Percebe­se  que  este  algoritmo  não  tem  um  custo  fixo.  Se 
todo o vetor estiver ordenado, ele nunca precisará iterar o i 
e  portanto  será  executado  bem  mais  rápido  do  que  se  o 
vetor  estiver  inteiro  em  ordem  decrescente  (quando  ele 
sempre precisará iterar i  até o fim ­ 0).
Ordenação BOLHA
Resumo
• O  bubble  sort,  ou  ordenação  por  flutuação 
(literalmente  "por  bolha"),  é  um  algoritmo 
de  ordenação  dos  mais  simples.  A  ideia  é 
percorrer  o  vetor  diversas  vezes,  a  cada 
passagem  fazendo  flutuar  para  o  topo  o 
maior  elemento  da  sequência.  Essa 
movimentação  lembra  a  forma  como  as 
bolhas  em  um  tanque  de  água  procuram 
seu  próprio  nível,  e  disso  vem  o  nome  do 
algoritmo. 
• Os  elementos  maiores  são  mais  leves,  e  sobem  como 
bolhas  até  suas  posições  corretas.  A  ideia 
fundamental é fazer uma série de comparações entre 
os  elementos  do  vetor.  Quando  dois  elementos  estão 
fora  de  ordem,  há  uma  inversão  e  esses  dois 
elementos são trocados de posição, ficando em ordem 
correta.  Assim,  o  primeiro  elemento  é  comparado 
com  o  segundo.  Se  uma  inversão  for  encontrada,  a 
troca é feita. Em seguida, independente se houve ou 
não  troca  após  a  primeira  comparação,  o  segundo 
elemento  é  comparado  com  o  terceiro,  e,  caso  uma 
inversão  seja  encontrada,  a  troca  é  feita.  O  processo 
continua  até  que  o  penúltimo  elemento  seja 
comparado com o último. Com este processo, garante­
se que o elemento de maior valor do vetor será levado 
para  a  última  posição.  A  ordenação  continua, 
posicionando  o  segundo  maior  elemento,  o  terceiro, 
etc., até que todo o vetor esteja ordenado.
Resumo:
• Comparam­se  dois  elementos  e  trocam­se  suas  posições 
se o segundo elemento é menor do que o primeiro.
• São feitas várias passagens pela tabela.
• Em  cada  passagem,  comparam­se  dois  elementos 
adjacentes.
• Se  estes  elementos  estiverem  fora  de  ordem,  eles  são 
trocados.
• A  complexidade  desse  algoritmo  é de  Ordem  quadrática. 
Por  isso,  ele  não  é  recomendado  para  programas  que 
precisem de velocidade e operem com quantidade elevada 
de dados. 
Vantagens:
• Simplicidade do algoritmo.
• Estável.

Desvantagens
• Lentidão.

Indicações
• Tabelas muito pequenas.
• Quando se sabe que a tabela está 
quase ordenada.
...Busca 
(Considerações finais)
Como realizar?
• A Recuperação de Informação é uma das tarefas mais importantes 
em computação; 
• A busca por chaves que localizam registros é, em geral, a
tarefa que consome mais tempo de um programa;
• Dessa maneira, o modo como os registros estão organizados e 
a  escolha  do  método  utilizado  para  realizar  a  busca  podem 
fazer diferença na performance do programa;
• Os  algoritmos  de  pesquisa  (busca  ou  "search"),  tem  como  objetivo 
pesquisar, procurar um particular elemento dentro de uma grande 
quantidade de dados de forma eficiente.
• A  eficiência  do  método  de  busca  a  ser  usado,  também  depende  da 
organização dos dados;
• Na prática, estes algoritmos são usados simplesmente para:
• 1. retornar o elemento  procurado (algoritmo de busca) quando 
este existe e
• 2. às vezes adicionar um elemento quando este não pertence ao 
conjunto total (algoritmo de busca e inserção).
Obs.:  se  um  arquivo  é pequeno, sofisticadas técnicas de  classificação 
projetadas  para  minimizar  espaço  e  tempo  são  usualmente  piores 
ou...
­somente  pouco  eficientes  que  outros  métodos  mais  simples, 
geralmente menos eficientes.
Principais 
algoritmos de 
busca
Sequencial e Binária
Pesquisa Sequencial

• Este método simplesmente faz a verificação


sequencial de cada elemento de um vetor ou
lista, até que o elemento desejado seja
encontrado, ou verifique que o elemento não
pertence à sequência;
• Tal método geralmente é usado para sequências de 
dados não ordenados.
Pesquisa Sequencial - Eficiência

Número de comparações a serem realizadas


depende da posição do elemento na sequência:
­se  este  é  o  primeiro  elemento,  somente  uma 
comparação é feita;
­se  for  o  último  elemento,  n  comparações  são 
necessárias;
­Se for igualmente provável ao elemento aparecer em 
qualquer  posição,  o  sucesso  na  pesquisa  ocorrerá  em 
média em  (n+1)/2 comparações e o não sucesso em n 
comparações;

De qualquer maneira, o
número de comparações é
Pesquisa Binária

• Se os elementos estiverem previamente


ordenados, um método de pesquisa muito
mais eficiente é o denominado pesquisa
binária;
• Neste,  o  elemento  procurado  é  comparado  com  o 
elemento central da sequência;
­Se forem iguais, a pesquisa termina com sucesso;
­caso  contrário,  a  metade  inferior  ou  superior  da 
sequência é pesquisada de maneira similar.
Pesquisa Binária - Eficiência

Cada comparação na pesquisa binária reduz o


número de possíveis candidatos por um fator de 2;
-Assim, o máximo de comparações a serem
realizadas é de aproximadamente log n para o
algoritmo dado, portanto O(log n);
- Algoritmos de busca binária são usados somente se

os dados estão organizados como um vetor, pois os


índices dos elementos são inteiros consecutivos;
-Assim, este método não é utilizado se houverem

muitas inserções e/ou retiradas, uma vez que tal


estrutura é pouco apropriada para estas operações.
Outros 
algoritmos de 
busca
Arvore de Busca Binária
Hash
Extras 
(Exemplificando 
com vídeos e 
animações)
• Arquivo selection.pdf
• Vídeo Vídeos\SelectionSort.wmv

OUTROS (revisão em casa)
• Ziviani, N. 
Projeto de Algoritmos com Implementações em Java e
 C++
, São Paulo, Brazil, Thomson Learning, ISBN 85­221­
0525­1
• http://www.youtube.com/watch?v=3titr0Hx8UU&featu
re=related
Insertion sort

• Arquivo insertion.pdf
• Vídeo InsertionSort.wmv

OUTROS (revisão em casa)
• Ziviani, N. 
Projeto de Algoritmos com Implementações em Java e
 C++
, São Paulo, Brazil, Thomson Learning, ISBN 85­221­
0525­1
• http://www.youtube.com/watch?v=3titr0Hx8UU&featu
re=related
Exercício + Vídeo 
(Estudo/Revisão em casa)

• Vídeo: BubbleSort.mp4.
REFERÊNCIAS BIBLIOGRÁFICAS

T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein,  Introduction to Algorithms, 3rd 
edition,  MIT Press, 2009.
Ziviani, N. Projeto de Algoritmos com Implementações em Java e C++, São Paulo, Brazil, 
Thomson Learning, ISBN 85­221­0525­1
Horowitz, E. and Sahni, S. (1987). Fundamentos de Estruturas de Dados. Ed. Campus. 
Kruse, R. (1997).
Data structures & program design in C. Prentice Hall, New Jersey, 2 edition. Lee, H. D. 
(2000). Notas didáticas. Algoritmos e Estruturas de Dados.

You might also like