(ACH2002) Introdução à Análise de Algoritmos - Aula 18
1. Aula 18 – Algoritmos de Ordena¸c˜ao:
CountingSort e RadixSort
Norton Trevisan Roman
norton@usp.br
25 de outubro de 2018
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 1 / 18
2. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
3. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
4. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Vimos tamb´em que esse tipo de algoritmo tem
limite Ω(n log n)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
5. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Vimos tamb´em que esse tipo de algoritmo tem
limite Ω(n log n)
Seriam esses os ´unicos tipos poss´ıveis?
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
6. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Vimos tamb´em que esse tipo de algoritmo tem
limite Ω(n log n)
Seriam esses os ´unicos tipos poss´ıveis?
Veremos que n˜ao
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
7. Ordena¸c˜ao
Vimos at´e agora algoritmos baseados apenas em
compara¸c˜oes entre os elementos da entrada
Os chamados algoritmos de ordena¸c˜ao por compara¸c˜ao
Vimos tamb´em que esse tipo de algoritmo tem
limite Ω(n log n)
Seriam esses os ´unicos tipos poss´ıveis?
Veremos que n˜ao
Se conseguirmos ter alguma informa¸c˜ao que nos
ajude, podemos fazer algoritmos melhores
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 2 / 18
9. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
10. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Ideia:
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
11. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Ideia:
Determinar, para cada elemento de entrada x, o n´umero de
elementos menores que x
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
12. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Ideia:
Determinar, para cada elemento de entrada x, o n´umero de
elementos menores que x
Usar essa informa¸c˜ao para colocar x diretamente em sua
posi¸c˜ao no arranjo de sa´ıda
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
13. Counting Sort
Pressuposto:
O Counting Sort assume que cada um dos n elementos da
entrada ´e um inteiro no intervalo de 0 a k, para algum
inteiro k
Ideia:
Determinar, para cada elemento de entrada x, o n´umero de
elementos menores que x
Usar essa informa¸c˜ao para colocar x diretamente em sua
posi¸c˜ao no arranjo de sa´ıda
Precisamos, no entanto, tomar cuidado para n˜ao incluirmos
elementos de mesmo valor na mesma posi¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 3 / 18
15. Counting Sort
Implementa¸c˜ao
Assumimos que a entrada ´e um arranjo A[1..n] (ou
seja, conhecemos o tamanho de A de antem˜ao)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 4 / 18
16. Counting Sort
Implementa¸c˜ao
Assumimos que a entrada ´e um arranjo A[1..n] (ou
seja, conhecemos o tamanho de A de antem˜ao)
Precisaremos de 2 outros arranjos:
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 4 / 18
17. Counting Sort
Implementa¸c˜ao
Assumimos que a entrada ´e um arranjo A[1..n] (ou
seja, conhecemos o tamanho de A de antem˜ao)
Precisaremos de 2 outros arranjos:
B[1..n]: guardar´a a sa´ıda ordenada
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 4 / 18
18. Counting Sort
Implementa¸c˜ao
Assumimos que a entrada ´e um arranjo A[1..n] (ou
seja, conhecemos o tamanho de A de antem˜ao)
Precisaremos de 2 outros arranjos:
B[1..n]: guardar´a a sa´ıda ordenada
C[0..k]: para armazenar o n´umero de ocorrˆencias de cada
elemento i de A (0 ≤ i ≤ k)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 4 / 18
19. Counting Sort
Implementa¸c˜ao
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
20. Counting Sort
Implementa¸c˜ao
Arranjo de entrada
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
21. Counting Sort
Implementa¸c˜ao
Valor do maior elemento em
A (ou algum outro limitante)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
22. Counting Sort
Implementa¸c˜ao
Fazemos C[i] conter
o n´umero de elementos
em A que s˜ao iguais a i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
23. Counting Sort
Implementa¸c˜ao
Repare que os valores
em A v˜ao de 0 a k, as-
sim como os ´ındices de
C (e que os ´ındices est˜ao
naturalmente ordenados)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
24. Counting Sort
Implementa¸c˜ao
Agora fazemos C[i] con-
ter o n´umero de elemen-
tos em A que s˜ao ≤ i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
25. Counting Sort
Implementa¸c˜ao
Colocamos cada elemento de
A na posi¸c˜ao correta em B
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
26. Counting Sort
Implementa¸c˜ao
Cuidamos de n˜ao incluir
novamente os repetidos
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
27. Counting Sort
Implementa¸c˜ao
O −1 ´e para mapear a
contagem ao ´ındice em B
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 5 / 18
28. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
29. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
30. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
C
0 1 2 3 4 5
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
31. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
32. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 0 0 0 0C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
33. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 0 0 0 0C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
34. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 0 0 0C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
35. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 0 0 0C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
36. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 0 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
37. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 0 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
38. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
39. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 0 1 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
40. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 1 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
41. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 1 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
42. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 2 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
43. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 2 1 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
44. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 2 2 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
45. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 0 2 2 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
46. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 0 2 2 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
47. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 0 2 2 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
48. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 0 2 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
49. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 0 2 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
50. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 2 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
51. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 2 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
52. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
53. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 3 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
54. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
55. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 0 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
56. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
57. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 1C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
58. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 8C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
i
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
59. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 8C
0 1 2 3 4 5
B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
60. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 7 7 8C
0 1 2 3 4 5
3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
61. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 6 7 8C
0 1 2 3 4 5
3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
62. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 6 7 8C
0 1 2 3 4 5
3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
63. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
2 2 4 6 7 8C
0 1 2 3 4 5
0 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
64. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 6 7 8C
0 1 2 3 4 5
0 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
65. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 6 7 8C
0 1 2 3 4 5
0 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
66. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 6 7 8C
0 1 2 3 4 5
0 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
67. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 5 7 8C
0 1 2 3 4 5
0 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
68. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 5 7 8C
0 1 2 3 4 5
0 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
69. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 4 5 7 8C
0 1 2 3 4 5
0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
70. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 3 5 7 8C
0 1 2 3 4 5
0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
71. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 3 5 7 8C
0 1 2 3 4 5
0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
72. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
1 2 3 5 7 8C
0 1 2 3 4 5
0 0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
73. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 5 7 8C
0 1 2 3 4 5
0 0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
74. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 5 7 8C
0 1 2 3 4 5
0 0 2 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
75. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 5 7 8C
0 1 2 3 4 5
0 0 2 3 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
76. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 8C
0 1 2 3 4 5
0 0 2 3 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
77. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 8C
0 1 2 3 4 5
0 0 2 3 3 3B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
78. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 8C
0 1 2 3 4 5
0 0 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
79. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 7C
0 1 2 3 4 5
0 0 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
80. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 7C
0 1 2 3 4 5
0 0 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
81. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 3 4 7 7C
0 1 2 3 4 5
0 0 2 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
82. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 2 4 7 7C
0 1 2 3 4 5
0 0 2 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
j
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
83. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 2 4 7 7C
0 1 2 3 4 5
0 0 2 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
84. Counting Sort
Implementa¸c˜ao
2 5 3 0 2 3 0 3A
k=5
0 2 2 4 7 7C
0 1 2 3 4 5
0 0 2 2 3 3 3 5B
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 6 / 18
85. Counting Sort
Complexidade
E qual a
complexidade
disso?
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
86. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
87. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
+O(n)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
88. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
+O(n)
+O(k)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
89. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
+O(n)
+O(k)
+O(n)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
90. Counting Sort
Complexidade
E qual a
complexidade
disso?
O(k)
+O(n)
+O(k)
+O(n)
O(n + k)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 7 / 18
91. Counting Sort
Complexidade
O(n + k) int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 8 / 18
92. Counting Sort
Complexidade
O(n + k)
Se k = O(n), ent˜ao
Counting Sort roda em
O(n)
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 8 / 18
93. Counting Sort
Complexidade
O(n + k)
Se k = O(n), ent˜ao
Counting Sort roda em
O(n)
k = O(n) significa que k
´e constante ou, no
m´aximo, linearmente
proporcional a n
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 8 / 18
94. Counting Sort
Complexidade
O(n + k)
Se k = O(n), ent˜ao
Counting Sort roda em
O(n)
k = O(n) significa que k
´e constante ou, no
m´aximo, linearmente
proporcional a n
Essa ´e a limita¸c˜ao do
algoritmo
int[] countingSort(int[] A, int k) {
int[] C = new int[k+1];
int[] B = new int[A.length];
for (int i=0; i<=k; i++)
C[i] = 0;
for (int j=0; j<A.length; j++)
C[A[j]]++;
for (int i=1; i<=k; i++)
C[i] = C[i] + C[i-1];
for (int j = A.length-1; j>=0; j--) {
B[C[A[j]]-1] = A[j];
C[A[j]]--;
}
return(B);
}
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 8 / 18
95. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
96. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Sim, mas para algoritmos baseados em compara¸c˜oes entre
elementos do arranjo
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
97. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Sim, mas para algoritmos baseados em compara¸c˜oes entre
elementos do arranjo
Nenhuma compara¸c˜ao entre elementos do arranjo
ocorre no Counting Sort
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
98. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Sim, mas para algoritmos baseados em compara¸c˜oes entre
elementos do arranjo
Nenhuma compara¸c˜ao entre elementos do arranjo
ocorre no Counting Sort
Em vez disso, ele usa esses valores para indexar o arranjo C
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
99. Counting Sort
Complexidade
Mas o limite inferior para ordena¸c˜ao n˜ao era
Ω(n log n)?
Sim, mas para algoritmos baseados em compara¸c˜oes entre
elementos do arranjo
Nenhuma compara¸c˜ao entre elementos do arranjo
ocorre no Counting Sort
Em vez disso, ele usa esses valores para indexar o arranjo C
Por isso o limite Ω(n log n) n˜ao se aplica
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 9 / 18
100. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
101. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Ou seja, valores iguais aparecem no arranjo de sa´ıda na
mesma ordem em que estavam no de entrada
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
102. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Ou seja, valores iguais aparecem no arranjo de sa´ıda na
mesma ordem em que estavam no de entrada
Isso ´e importante quando cada dado carrega consigo
outros dados sat´elites
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
103. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Ou seja, valores iguais aparecem no arranjo de sa´ıda na
mesma ordem em que estavam no de entrada
Isso ´e importante quando cada dado carrega consigo
outros dados sat´elites
Que dependem da ordem do dado em rela¸c˜ao aos que tˆem o
mesmo valor no arranjo
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
104. Counting Sort
Ordena¸c˜ao Est´avel
Uma importante propriedade do Counting Sort ´e
que ele ´e est´avel
Ou seja, valores iguais aparecem no arranjo de sa´ıda na
mesma ordem em que estavam no de entrada
Isso ´e importante quando cada dado carrega consigo
outros dados sat´elites
Que dependem da ordem do dado em rela¸c˜ao aos que tˆem o
mesmo valor no arranjo
Mais adiante veremos um exemplo de onde isso ´e
importante...
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 10 / 18
105. Radix Sort
Radix Sort
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 11 / 18
107. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
108. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Onde o d´ıgito 1 ´e o menos significativo (direita) e o d´ıgito d
o mais significativo (esquerda)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
109. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Onde o d´ıgito 1 ´e o menos significativo (direita) e o d´ıgito d
o mais significativo (esquerda)
Ex: CEP – inteiro de 8 d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
110. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Onde o d´ıgito 1 ´e o menos significativo (direita) e o d´ıgito d
o mais significativo (esquerda)
Ex: CEP – inteiro de 8 d´ıgitos
Note que cada elemento da entrada ter um
comprimento m´aximo constante o torna
independente de n
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
111. Radix Sort
Pressuposto:
O Radix Sort assume que cada um dos n elementos da
entrada ´e um inteiro de, no m´aximo, d d´ıgitos (d constante)
Onde o d´ıgito 1 ´e o menos significativo (direita) e o d´ıgito d
o mais significativo (esquerda)
Ex: CEP – inteiro de 8 d´ıgitos
Note que cada elemento da entrada ter um
comprimento m´aximo constante o torna
independente de n
Independente do tamanho da pr´opria entrada
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 12 / 18
113. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
114. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
115. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
116. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
117. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
118. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
119. Radix Sort
Funcionamento
1 Ordene os valores primeiro pelo d´ıgito menos significativo
2 Repita a opera¸c˜ao para o segundo d´ıgito menos significativo
3 Continue at´e ter passado por todos os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 13 / 18
121. Radix Sort
Funcionamento
Para que isso funcione, ´e essencial que a ordena¸c˜ao
dos d´ıgitos seja est´avel
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 14 / 18
122. Radix Sort
Funcionamento
Para que isso funcione, ´e essencial que a ordena¸c˜ao
dos d´ıgitos seja est´avel
De modo a manter a ordem dos d´ıgitos menos significativos
j´a ordenados
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 14 / 18
123. Radix Sort
Funcionamento
Para que isso funcione, ´e essencial que a ordena¸c˜ao
dos d´ıgitos seja est´avel
De modo a manter a ordem dos d´ıgitos menos significativos
j´a ordenados
Ex: Counting Sort e QuickSort (se implementado para tal)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 14 / 18
124. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
125. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
E qual a complexidade disso?
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
126. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
E qual a complexidade disso?
O(1)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
127. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
E qual a complexidade disso?
O(1)×O(f (n)), onde O(f (n)) ´e a complexidade do
algoritmo de ordena¸c˜ao usado
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
128. Radix Sort
Algoritmo
radixSort(A, d):
para i = 1 at´e d:
use um m´etodo est´avel para ordenar o
arranjo A no digito i
E qual a complexidade disso?
O(1)×O(f (n)), onde O(f (n)) ´e a complexidade do
algoritmo de ordena¸c˜ao usado
Se este for o Counting Sort, em sua vers˜ao linear, ent˜ao
O(f (n)) = O(n), e o Radix Sort ser´a O(n)
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 15 / 18
129. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
130. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Hoje, por vezes usado para ordenar registros de
informa¸c˜ao que possuem m´ultiplas chaves
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
131. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Hoje, por vezes usado para ordenar registros de
informa¸c˜ao que possuem m´ultiplas chaves
Ex: datas
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
132. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Hoje, por vezes usado para ordenar registros de
informa¸c˜ao que possuem m´ultiplas chaves
Ex: datas
Podemos usar um algoritmo de ordena¸c˜ao cuja fun¸c˜ao de
compara¸c˜ao retorne a maior de duas dadas, comparando ano e, em
caso de empate, mˆes e, em caso de empate, dia
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
133. Radix Sort
Observa¸c˜oes
Antigamente usado nas m´aquinas mecˆanicas de
ordenar cartas
Hoje, por vezes usado para ordenar registros de
informa¸c˜ao que possuem m´ultiplas chaves
Ex: datas
Podemos usar um algoritmo de ordena¸c˜ao cuja fun¸c˜ao de
compara¸c˜ao retorne a maior de duas dadas, comparando ano e, em
caso de empate, mˆes e, em caso de empate, dia
Ou ordenar a informa¸c˜ao 3 vezes com um m´etodo est´avel de
ordena¸c˜ao: primeiro no dia, em seguida no mˆes, e ent˜ao no ano
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 16 / 18
134. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
135. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Com impacto direto em sua complexidade
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
136. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Com impacto direto em sua complexidade
Se usado com Counting sort:
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
137. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Com impacto direto em sua complexidade
Se usado com Counting sort:
Tem complexidade linear
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
138. Radix Sort
Observa¸c˜oes
Altamente dependente do m´etodo usado para
ordenar os d´ıgitos
Com impacto direto em sua complexidade
Se usado com Counting sort:
Tem complexidade linear
N˜ao ´e in-place, criando diversos arranjos auxiliares na
mem´oria
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 17 / 18
139. Referˆencias
Cormen, Thomas H., Leiserson, Charles E., Rivest, Ronald L.,
Stein, Clifford. Introduction to Algorithms. 2a ed. MIT Press,
2001.
https://www.geeksforgeeks.org/radix-sort/
Norton Trevisan Romannorton@usp.br Aula 18 – Algoritmos de Ordena¸c˜ao: CountingSort e RadixSort25 de outubro de 2018 18 / 18