Algoritmos de Ordenac¸ ˜ao
Talles Brito Viana
IFCE Campus Crato
7 de fevereiro de 2020.
Este slide ainda ´e uma vers˜ao de rascunho.Acesse https://sites.google.com/site/tallesbrito/
disciplinas/pesquisa-e-ordenacao-de-dados para obter atualizac¸˜oes.
Ordenac¸ ˜ao
O que ´e?
Ordenar: processo de rearranjar um conjunto de objetos em uma ordem ascendente ou descendente.
A ordenac¸˜ao visa facilitar a recuperac¸˜ao posterior de itens do conjunto ordenado.
Os algoritmos operam sob os registros de um conjunto de dados. Cada registro possui uma chave utilizada para controlar a ordenac¸˜ao.
Ordenac¸ ˜ao por Selec¸ ˜ao
Definic¸ ˜ao
Ordenac¸˜ao por Selec¸˜ao ´e um dos algoritmos mais simples de ordenac¸˜ao.
Algoritmo (abstrato):
Selecione o menor item do arranjo. Troque-o com o item da primeira posic¸˜ao.
Repita estas duas operac¸˜oes com os n − 1 itens restantes, depois com os n − 2 itens, at´e que reste apenas um elemento.
Ordenac¸ ˜ao por Selec¸ ˜ao
Definic¸ ˜ao
Ordenac¸˜ao por Selec¸˜ao ´e um dos algoritmos mais simples de ordenac¸˜ao.
Algoritmo (abstrato):
Selecione o menor item do arranjo. Troque-o com o item da primeira posic¸˜ao.
Repita estas duas operac¸˜oes com os n − 1 itens restantes, depois com os n − 2 itens, at´e que reste apenas um elemento.
Ordenac¸ ˜ao por Selec¸ ˜ao
Ordenac¸ ˜ao por Selec¸ ˜ao
Algoritmo
Algoritmo: SELECTION-SORT (A, n) Dados:
A: um arranjo.
n: quantidade de elementos em A a ordenar.
Resultado: Os elementos de A s˜ao ordenados. 1 para i ←− 1 at ´e n − 1 fac¸a
2 menor←− i;
3 para j ←− i + 1 at ´e n fac¸a 4 se A[j] < A[menor] ent ˜ao
5 menor←− j;
Ordenac¸ ˜ao por Selec¸ ˜ao
An ´alise de Complexidade Para n = 6: O R D E N A → 5 A R D E N O → 4 A D R E N O → 3 A D E R N O → 2 A D E N R O → 1 A D E N O R Total de comparac¸˜oes T(n) = 1 + 2 + 3 · · · + (n − 1) =Pn−1 i=1 i. Primeiro termo =⇒ 1. ´ Ultimo termo =⇒ (n − 1). Quantidade de termos =⇒ (n − 1). T(n) = (1 + (n − 1))(n − 1) 2 = n2− n 2 = 1 2n 2−1 2n= θ(n 2).Ordenac¸ ˜ao por Inserc¸ ˜ao
Definic¸ ˜ao
Ordenac¸˜ao por Inserc¸˜ao ´e o m´etodo preferido dos jogadores de cartas.
Algoritmo → Em cada passo a partir de i = 2 fac¸a:
Selecione o i-´esimo item da sequˆencia fonte.
Coloque-o no lugar apropriado na sequˆencia destino de acordo com o crit´erio de ordenac¸˜ao.
Ordenac¸ ˜ao por Inserc¸ ˜ao
Ordenac¸ ˜ao por Inserc¸ ˜ao
Algoritmo
Algoritmo: INSERTION-SORT (A, n) Dados:
A: um arranjo.
n: quantidade de elementos em A a ordenar.
Resultado: Os elementos de A s˜ao ordenados. 1 para i ←− 2 at ´e n fac¸a
2 chave←− A[i];
3 j←− i − 1;
4 enquanto j > 0 E A[j] > chave fac¸a
5 A[j + 1] ←− A[j];
6 j←− j − 1;
Ordenac¸ ˜ao por Inserc¸ ˜ao
An ´alise de Complexidade
Para n = 6: A D E N O R → 5
No melhor caso, tem-se que: Total de comparac¸˜oes T(n) = (n − 1) = Ω(n).
Ordenac¸ ˜ao por Inserc¸ ˜ao
An ´alise de Complexidade Para n = 6: 2 = 1 + 1 ← R O N E D A 3 = 1 + 2 ← O R N E D A 4 = 1 + 3 ← N O R E D A 5 = 1 + 4 ← E N O R D A 6 = 1 + 5 ← D E N O R A A D E N O RNo pior caso para n ≥ 2, tem-se que: Total de comparac¸˜oes T(n) = 2 + 3 · · · + n =Pn i=2i. Primeiro termo =⇒ 2. ´ Ultimo termo =⇒ n. Quantidade de termos =⇒ (n − 1). T(n) = (2 + n)(n − 1) 2 = 2(n − 1) + n(n − 1) 2 = (2n − 2 + n2− n) 2 = n2+ n − 2 2 = 1 n2+ 1n− 1 = O(n2).
Ordenac¸ ˜ao R ´apida (Quicksort)
Hist ´orico e Definic¸ ˜ao
Publicado em 1961: https://dl.acm.org/citation. cfm?doid=366622.366644.
´
E o algoritmo de ordenac¸˜ao interna mais r´apido que se conhece para uma ampla variedade de situac¸˜oes.
Provavelmente ´e o mais utilizado.
A ideia b´asica ´e dividir o problema de ordenar um conjunto com
nitens em dois problemas menores.
Os problemas menores s˜ao ordenados independentemente. Os resultados s˜ao combinados para produzir a soluc¸˜ao final.
Ordenac¸ ˜ao R ´apida (Quicksort)
Hist ´orico e Definic¸ ˜ao
A parte mais delicada do m´etodo ´e o processo de partic¸˜ao. O arranjo A[p..r] ´e rearranjado por meio da escolha arbitr´aria de um pivˆo A[r].
O arranjo A ´e particionado em duas partes:
As duas partes s˜ao divididas na posic¸˜ao q.
No final do processo o pivˆo A[r] ´e movido para a posic¸˜ao A[q]. A parte esquerda A[p..q − 1] tem chaves menores ou iguais a A[q]. A parte direita A[q + 1..r] tem chaves maiores a A[q].
Particionamento
Algoritmo
Algoritmo: PARTITION (A, p, r) Dados:
A: um arranjo.
p: ´ındice inicial de um subvetor de A. r: ´ındice final de um subvetor de A.
Resultado: Rearranja os elementos de A[p..r] de modo que
A[p..q − 1] ≤ A[q] e A[q + 1..r] > A[q] e retorna q.
1 q←− p;
2 para u ←− p at ´e r − 1 fac¸a 3 se A[u] ≤ A[r] ent ˜ao
4 A[q] ←→ A[u];
Particionamento
Ordenac¸ ˜ao R ´apida (Quicksort)
Algoritmo
Algoritmo: QUICKSORT (A, p, r) Dados:
A: um arranjo.
p: ´ındice inicial de um subvetor de A. r: ´ındice final de um subvetor de A.
Resultado: Os elementos do subvetor A[p..r] s˜ao ordenados. 1 se p ≥ r ent ˜ao
2 Retorne sem fazer nada;
3 sen ˜ao
4 q←−PARTITION(A, p, r);
Ordenac¸ ˜ao R ´apida (Quicksort)
An ´alise do Quicksort
An ´alise
Tempo de execuc¸ ˜ao T(n) para QUICKSORT no pior caso:
T(n) = (
θ(1), se n = 1 ou 0
T(n − 1) + T(0) + θ(n), se n > 1
An ´alise do Quicksort
An ´alise
Tempo de execuc¸ ˜ao T(n) para QUICKSORT no melhor caso:
T(n) = (
θ(1), se n = 1
2T(n/2) + θ(n), se n > 1
Toleramos o desleixo de subtrair 1 do tamanho de um dos subproblemas gerados.
Ordenac¸ ˜ao por Contagem
Definic¸ ˜ao
A Ordenac¸˜ao por Contagem assume que cada item do arranjo
Ade entrada ´e um n´umero inteiro entre 0 e k.
O algoritmo conta a ocorrˆencia de cada item 0 ≤ x ≤ k na entrada A.
Neste algoritmo n˜ao existem comparac¸˜oes entre as chaves, no que isto implica?
O algoritmo tem complexidade de tempo linear.
Apesar disso, necessita manter uma c´opia tempor´aria dos itens a serem ordenados.
Ordenac¸ ˜ao por Contagem
Definic¸ ˜ao
A Ordenac¸˜ao por Contagem assume que cada item do arranjo
Ade entrada ´e um n´umero inteiro entre 0 e k.
O algoritmo conta a ocorrˆencia de cada item 0 ≤ x ≤ k na entrada A.
Neste algoritmo n˜ao existem comparac¸˜oes entre as chaves, no que isto implica?
O algoritmo tem complexidade de tempo linear.
Apesar disso, necessita manter uma c´opia tempor´aria dos itens a serem ordenados.
Ordenac¸ ˜ao por Contagem
Algoritmo
Algoritmo: COUNTING-SORT (A, n, k) Dados:
A: um arranjo de tamanho n.
k: valor m´aximo ≥ 0 que pode ocorrer em A.
Resultado: Os elementos de A s˜ao ordenados.
1 Declare C[0..k] como novo arranjo;
2 Declare B[1..n] como novo arranjo;
3 para i ←− 0 at ´e k fac¸a
4 C[i] ←− 0;
5 para j ←− 1 at ´e n fac¸a
6 C[A[j]] ←− C[A[j]] + 1;
Ordenac¸ ˜ao por Contagem
Algoritmo
Algoritmo: COUNTING-SORT (A, n, k) Dados:
A: um arranjo.
n: quantidade de elementos em A a ordenar. k: valor m´aximo ≥ 0 que pode ocorrer em A.
Resultado: Os elementos de A s˜ao ordenados. 9 para j ←− n to 1 fac¸a //decremento
10 B[C[A[j]]] ←− A[j];
11 C[A[j]] ←− C[A[j]] − 1;
12 para j ←− 1 at ´e n fac¸a