Análise de Algoritmos
• Ordenação por comparação
▫ (n log n)
▫ Quicksort
▫ Heapsort
▫ Mergesort
• Ordenação em tempo linear
▫ O(n)
▫ Countingsort
▫ Radixsort
▫ Bucketsort
www.nakamura.eti.br/eduardo Análise de Algoritmos 2
• Ordenação por contagem
▫ Pressupõe que cada um dos n elementos de entrada é um inteiro no intervalo de 1 a k, para algum inteiro k
▫ A ordenação é executada em (k+n)
• Idéia básica
▫ Determinar, para cada elemento de entrada x, o número de elementos menores que x
▫ Assim o elemento x pode ser inserido na posição correta
▫ Se há 13 elementos menores que x, então x ficará na posição 14
▫ Cuidado com valores iguais
www.nakamura.eti.br/eduardo Análise de Algoritmos 3
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
• Entrada
▫ A[1..n] – arranjo a ser ordenado
▫ B[1..n] – arranjo de saída ordenado
▫ k – o maior valor possível dentro do arranjo
• Além disso
▫ C[0..k] – arranjo para
armazenamento temporário
www.nakamura.eti.br/eduardo Análise de Algoritmos 4
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 5
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C
j = 1
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 6
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 0 0 0 0 0 0
j = 1
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 7
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 0 0 0 0 0 0
j = 1
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 8
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 0 0 1 0 0 0
j = 1
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 9
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 0 0 1 0 0 0
j = 2
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 10
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 0 0 1 0 0 1
j = 2
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 11
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 0 0 1 0 0 1
j = 3
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 12
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 0 0 1 1 0 1
j = 3
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 13
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 0 0 1 1 0 1
j = 4
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 14
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 1 0 1 1 0 1
j = 4
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 2 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 15
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 1 0 1 1 0 1
j = 5
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 16
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 1 0 2 1 0 1
j = 5
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 17
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 1 0 2 1 0 1
j = 6
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 18
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 1 0 2 2 0 1
j = 6
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 19
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 1 0 2 2 0 1
j = 7
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 20
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 0 2 2 0 1
j = 7
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 21
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 0 2 2 0 1
j = 8
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 22
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 0 2 3 0 1
j = 8
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 23
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 0 2 3 0 1
Para todo 0 i k,
C[i] possui o número de
elementos iguais a i
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 24
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 0 2 3 0 1
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 25
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 0 2 3 0 1
i = 1
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 26
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 2 3 0 1
i = 1
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 27
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 2 3 0 1
i = 2
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 28
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 3 0 1
i = 2
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 29
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 3 0 1
i = 3
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 30
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 7 0 1
i = 3
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 31
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 7 0 1
i = 4
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 32
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 7 7 1
i = 4
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 33
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 7 7 1
i = 5
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 34
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 7 7 8
i = 5
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 35
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 7 7 8
Para todo 0 i k,
C[i] possui o número de
elementos menores ou
iguais a i
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 36
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B
0 1 2 3 4 5
C 2 2 4 7 7 8
j = 8
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 37
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 3
0 1 2 3 4 5
C 2 2 4 7 7 8
j = 8
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 38
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 3
0 1 2 3 4 5
C 2 2 4 6 7 8
j = 8
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 39
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 0 3
0 1 2 3 4 5
C 2 2 4 6 7 8
j = 7
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 40
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 0 3 3
0 1 2 3 4 5
C 1 2 4 6 7 8
j = 6
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 41
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 0 2 3 3
0 1 2 3 4 5
C 1 2 4 5 7 8
j = 5
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 42
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 0 0 2 3 3
0 1 2 3 4 5
C 1 2 3 5 7 8
j = 4
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 43
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 0 0 2 3 3 3
0 1 2 3 4 5
C 0 2 3 5 7 8
j = 3
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 44
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 0 0 2 3 3 3 5
0 1 2 3 4 5
C 0 2 3 4 7 8
j = 2
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 45
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 0 0 2 2 3 3 3 5
0 1 2 3 4 5
C 0 2 3 4 7 7
j = 1
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 46
k=5 1 2 3 4 5 6 7 8
A 2 5 3 0 2 3 0 3
1 2 3 4 5 6 7 8
B 0 0 2 2 3 3 3 5
0 1 2 3 4 5
C 0 2 2 4 7 7
COUNTINGSORT(A,B,k) 1: for i 0 to k do 2: C[i] 0;
3: end for
4: for j 1 to n do
5: C[A[j]] C[A[j]]+1;
6: end for
7: for i 1 to k do
8: C[i] C[i]+C[i-1];
9: end for
10: for j n downto 1 do 11: B[C[A[j]]] A[j];
12: C[A[j]] C[A[j]]-1;
13: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 47
2 k
) (
5 ) (
2 )
( n k n n k
T
1 n
1 k
1
n
• Ordenação por raiz
▫ Algoritmo usado por máquinas de cartão
▫ Peças de museu
• Princípio
▫ Ordena por dígito
▫ Do menos significativo para o mais significativo
www.nakamura.eti.br/eduardo Análise de Algoritmos 48
RADIXSORT(A,d)
1: for i 1 to d do
2: ORDENA A pelo dígito i;
3: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 49
www.nakamura.eti.br/eduardo Análise de Algoritmos 51
1 2 3 4 5 6 7 8
A 170 45 75 90 2 24 802 66
A
1 1 7 0
2 0 4 5
3 0 7 5
4 0 9 0
5 0 0 2
6 0 2 4
7 8 0 2
8 0 6 6
A
1 1 7 0
2 0 9 0
3 0 0 2
4 8 0 2
5 0 2 4
6 0 4 5
7 0 7 5
8 0 6 6
A
1 0 0 2
2 8 0 2
3 0 2 4
4 0 4 5
5 0 6 6
6 1 7 0
7 0 7 5
8 0 9 0 A
1 1 7 0
2 0 9 0
3 0 0 2
4 8 0 2
5 0 2 4
6 0 4 5
7 0 7 5
8 0 6 6
A
1 0 0 2
2 8 0 2
3 0 2 4
4 0 4 5
5 0 6 6
6 1 7 0
7 0 7 5
8 0 9 0
A
1 0 0 2
2 0 2 4
3 0 4 5
4 0 6 6
5 0 7 5
6 0 9 0
7 1 7 0
8 8 0 2
RADIXSORT(A,d)
1: for i 1 to d do
2: ORDENA A pelo dígito i;
3: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 52
Qual algoritmo você adaptaria
para ordenar pelo dígito?
RADIXSORT(A,d)
1: for i 1 to d do
2: ORDENA A pelo dígito i;
3: end for
RADIXSORT(A,d)
1: for i 1 to d do
2: ORDENA A pelo dígito i com o COUNTINGSORT;
3: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 53
RADIXSORT(A,d)
1: for i 1 to d do
2: ORDENA A pelo dígito i com o COUNTINGSORT;
3: end for
www.nakamura.eti.br/eduardo Análise de Algoritmos 54
) ( k n vezes
d
( )
)
( n d n k
T
• A i-ésima estatística de ordem de um conjunto de n elementos é o i-ésimo menor elemento
▫ O mínimo de um conjunto de n elementos é a primeira estatística de ordem (i = 1)
▫ O máximo de um conjunto de n elementos é a n-ésima estatística de ordem (i = n)
www.nakamura.eti.br/eduardo Análise de Algoritmos 55
• Ponto médio do conjunto
▫ Para n ímpar a mediana é única, ocorrendo em i = (n+1)/2
▫ Para n par existem duas medianas uma em i = n/2 outra em i = n/2 + 1
• Independente da paridade de n, as medianas são
▫ Mediana inferior em i = (n+1)/2
▫ Mediana superior em i = (n+1)/2
www.nakamura.eti.br/eduardo Análise de Algoritmos 56
• Entrada
▫ Um conjunto A de n números (distintos) e um número i, tal que 1 i n
• Saída
▫ O elemento x A que é maior que, exatamente, i – 1 outros elementos
• A i-ésima estatística de ordem de um conjunto A
www.nakamura.eti.br/eduardo Análise de Algoritmos 57
MINIMO(A)
1: MERGESORT(A,1,n);
2: return A[1];
MAXIMO(A)
1: MERGESORT(A,1,n);
2: return A[n];
www.nakamura.eti.br/eduardo Análise de Algoritmos 58
) log (
)
( n n n
T
MINIMO(A)
1: MERGESORT(A,1,n);
2: return A[1];
MINIMO(A)
1: min A[1];
2: for i 2 to n do 3: if A[i] < min then 4: min A[i];
5: end if 6: end for
7: return min;
www.nakamura.eti.br/eduardo Análise de Algoritmos 59
) log (
)
( n n n
T
) ( 1
)
( n n n
T
MINIMO(A)
1: min A[1];
2: for i 2 to n do 3: if A[i] < min then 4: min A[i];
5: end if 6: end for
7: return min;
MAXIMO(A)
1: max A[1];
2: for i 2 to n do 3: if A[i] > max then 4: max A[i];
5: end if 6: end for
7: return max;
www.nakamura.eti.br/eduardo Análise de Algoritmos 60
) ( 1
)
( n n n
T
MINMAX(A)
1: min A[1];
2: max A[1];
2: for i 2 to n do 3: if A[i] < min then 4: min A[i];
5: end if
3: if A[i] > max then 4: max A[i];
5: end if 6: end for
7: return [min,max];
www.nakamura.eti.br/eduardo Análise de Algoritmos 61
) ( )
1 (
2 )
( n n n
T
MINMAX(A)
1: min A[1];
2: max A[1];
2: for i 2 to n do 3: if A[i] < min then 4: min A[i];
5: end if
3: if A[i] > max then 4: max A[i];
5: end if 6: end for
7: return [min,max];
www.nakamura.eti.br/eduardo Análise de Algoritmos 62