Está en la página 1de 13

Algoritmo Counting Sort

19 de septiembre de 2020

1. Definición
1.1. ¿QUE ES?
Es un algoritmo de ordenamiento en el que se cuenta el número de ele-
mentos de cada clase para luego ordenarlos. Solo puede ser utilizados por
tanto para ordenar elementos que sea contables.

2. Detallando el algoritmo
El ordenamiento de conteo asume que cada uno de los n elementos de
entrada es un número entero en el rango 0 a k, para algún número entero k.
Cuando k = O(n), la clasificación se ejecuta en Θ(n) tiempo. El ordenamiento
por recuento determina, para cada elemento de entrada x, el número de
elementos menos que x. Utiliza esta información para colocar el elemento
x directamente en su posición en el matriz de salida. Por ejemplo, si 17
elementos son menores que x, entonces x pertenece a la salida posición 18.
Debemos modificar este esquema ligeramente para manejar la situación en
la que varios elementos tienen el mismo valor, ya que no queremos ponerlos
todos en la misma posición. En el código para contar ordenación, asumimos
que la entrada es una matriz A[1..n], y ası́ A. longitud = n. Necesitamos otras
dos matrices: la matriz B[1 . . n] contiene la salida ordenada, y la matriz C
[0. . k] proporciona almacenamiento de trabajo temporal.

1
3. Algoritmo
Counting Sort (A,B,K)
for i − > C[0 . . K] un nuevo array
se usa la tabla de array para buscar los digitos

d: Número máximo de dı́gitos


n: Tamaño del Array
A: Array
Pocket: Lista contenedora auxiliar

Datos de entrada:

0 1 2 3 4 5 6 7
2 5 3 0 2 3 0 3

cuenta Matriz

0 2 3 5
2 2 3 1

Datos Ordenados − > RESULTADO

0 1 2 3 4 5 6 7
0 0 1 2 2 3 3 3

4. Rastreo
COUNTING SORT (A,B,K)

1. let [0..k] be a new array

2. for i = 0 to K

3. C[i] = 0

4. for j = 1 to A.length

2
5. C[A[j]] = C[A[j]] + 1
6. C[i] now contains the number of elements equal to i .
7. for i = 1 to k
8. C[i] = C[i] + C [i - 1]
9. C[i] now contains the number of elements less than or equal to i .
10. for j = A.length downto 1
11. B[C[A[j]]] = A[i]
12. C[A[j]] = C[A[j]] - 1

Datos Ordenados − > RESULTADO

0 1 2 3 4 5 6 7
0 0 1 2 2 3 3 3

cuenta Matriz
0 2 3 5
2 2 3 1

for i = 0 to 3 - 1 do
m = 100+1 = 10
p = 100 = 1

for j = 0 to (7 - 1) do
temp = A[0] mod 10 = 9
index = temp/1 = 9
pocket[9].append(A[0])

for j = 1 to (7 - 1) do
temp = A[1] mod 10 = 7
index = temp/1 = 7
pocket[7].append(A[1])

for j = 2 to (7 - 1) do

3
temp = A[2] mod 10 = 7
index = temp/1 = 7
pocket[7].append(A[2])

for j = 3 to (7 - 1) do
temp = A[3] mod 10 = 9
index = temp/1 = 9
pocket[9].append(A[3])

for j = 4 to (7 - 1) do
temp = A[4] mod 10 = 6
index = temp/1 = 6
pocket[6].append(A[4])

for j = 5 to (7 - 1) do
temp = A[5] mod 10 = 0
index = temp/1 = 0
pocket[0].append(A[5])

for j = 6 to (7 - 1) do
temp = A[6] mod 10 = 5
index = temp/1 = 5
pocket[5].append(A[6])

for j = 7 to (7 - 1) do, no cumple la condición


done

count = 0
for j = 0 to 10 do

while pocket[0] is not empty − > true


A[0] = get first node of pocket[0] and delete it
count = count + 1
while pocket[0] is not empty − > false
done
done
for j = 1 to 10 do
while pocket[1] is not empty − > false

4
done
done
for j = 2 to 10 do
while pocket[2] is not empty − > false
done
done
for j = 3 to 10 do
while pocket[3] is not empty − > false
done
done
for j = 4 to 10 do
while pocket[4] is not empty − > false
done
done
for j = 5 to 10 do
while pocket[5] is not empty − > true
A[1] = get first node of pocket[5] and delete it
count = count + 1
while pocket[5] is not empty − > false
done
done
for j = 6 to 10 do
while pocket[6] is not empty − > true
A[2] = get first node of pocket[6] and delete it
count = count + 1
while pocket[6] is not empty − > false
done
done
for j = 7 to 10 do
while pocket[7] is not empty − > true
A[3] = get first node of pocket[7] and delete it
count = count + 1
while pocket[7] is not empty − > true
A[4] = get first node of pocket[7] and delete it
count = count + 1
while pocket[7] is not empty − > false
done
done

5
for j = 8 to 10 do
while pocket[8] is not empty − > false
done
done
for j = 9 to 10 do
while pocket[9] is not empty − > true
A[5] = get first node of pocket[7] and delete it
count = count + 1
while pocket[9] is not empty − > true
A[6] = get first node of pocket[9] and delete it
count = count + 1
while pocket[9] is not empty − > false
done
done
for j = 10 to 10 do
while pocket[8] is not empty − > false
done
done

Array:

0 1 2 3 4 5 6
720 355 436 457 657 329 839

for i = 1 to 3 - 1 do
m = 101+1 = 102 = 100
p = 101 = 10

for j = 0 to (7 - 1) do
temp = A[0] mod 100 = 20
index = temp/10 = 2
pocket[2].append(A[0])

for j = 1 to (7 - 1) do
temp = A[1] mod 100 = 55
index = temp/10 = 5
pocket[5].append(A[1])

6
for j = 2 to (7 - 1) do
temp = A[2] mod 100 = 36
index = temp/10 = 3
pocket[3].append(A[2])

for j = 3 to (7 - 1) do
temp = A[3] mod 100 = 57
index = temp/10 = 5
pocket[5].append(A[3])

for j = 4 to (7 - 1) do
temp = A[4] mod 100 = 57
index = temp/10 = 5
pocket[5].append(A[4])

for j = 5 to (7 - 1) do
temp = A[5] mod 100 = 29
index = temp/10 = 2
pocket[2].append(A[5])

for j = 6 to (7 - 1) do
temp = A[6] mod 100 = 39
index = temp/10 = 3
pocket[3].append(A[6])

for j = 7 to (7 - 1) do, no cumple la condición


done

Lista pocket:

0 1 2 3 4 5 6 7 8 9
720 436 355
329 839 457
657

Array:
count = 0
for j = 0 to 10 do

7
0 1 2 3 4 5 6
720 329 436 839 355 457 657

while pocket[0] is not empty − > false


done
done
for j = 1 to 10 do
while pocket[1] is not empty − > false
done
done
for j = 2 to 10 do
while pocket[2] is not empty − > true
A[0] = get first node of pocket[2] and delete it
count = count + 1
while pocket[2] is not empty − > true
A[1] = get first node of pocket[2] and delete it
count = count + 1
while pocket[2] is not empty − > false
done
done
for j = 3 to 10 do
while pocket[3] is not empty − > true
A[2] = get first node of pocket[3] and delete it
count = count + 1
while pocket[3] is not empty − > true
A[3] = get first node of pocket[3] and delete it
count = count + 1
while pocket[3] is not empty − > false
done
done
for j = 4 to 10 do
while pocket[4] is not empty − > false
done
done
for j = 5 to 10 do
while pocket[5] is not empty − > true
A[4] = get first node of pocket[5] and delete it

8
count = count + 1
while pocket[5] is not empty − > true
A[5] = get first node of pocket[5] and delete it
count = count + 1
while pocket[5] is not empty − > true
A[6] = get first node of pocket[5] and delete it
count = count + 1
while pocket[5] is not empty − > false
done
done
for j = 6 to 10 do
while pocket[6] is not empty − > false
done
done
for j = 7 to 10 do
while pocket[7] is not empty − > false
done
done
for j = 8 to 10 do
while pocket[8] is not empty − > false
done
done
for j = 9 to 10 do
while pocket[9] is not empty − > false
done
done
for j = 10 to 10 do
while pocket[10] is not empty − > false
done
done

Lista pocket:

0 1 2 3 4 5 6 7 8 9
329 436 657 720 839
355 457

Array:

9
0 1 2 3 4 5 6
329 355 436 457 657 720 839

for i = 2 to 3 - 1 do
m = 102+1 = 103 = 1000
p = 102 = 100

for j = 0 to (7 - 1) do
temp = A[0] mod 1000 = 720
index = temp/100 = 7
pocket[7].append(A[0])

for j = 1 to (7 - 1) do
temp = A[1] mod 1000 = 329
index = temp/100 = 3
pocket[3].append(A[1])

for j = 2 to (7 - 1) do
temp = A[2] mod 1000 = 436
index = temp/100 = 4
pocket[4].append(A[2])

for j = 3 to (7 - 1) do
temp = A[3] mod 1000 = 839
index = temp/100 = 8
pocket[8].append(A[3])

for j = 4 to (7 - 1) do
temp = A[4] mod 1000 = 355
index = temp/100 = 3
pocket[3].append(A[4])

for j = 5 to (7 - 1) do
temp = A[5] mod 1000 = 457
index = temp/100 = 4
pocket[4].append(A[5])

10
for j = 6 to (7 - 1) do
temp = A[6] mod 1000 = 657
index = temp/100 = 6
pocket[6].append(A[6])

for j = 7 to (7 - 1) do, no cumple la condición


done

count = 0
for j = 0 to 10 do
while pocket[0] is not empty − > false
done
done
for j = 1 to 10 do
while pocket[1] is not empty − > false
done
done
for j = 2 to 10 do
while pocket[2] is not empty − > false
done
done
for j = 3 to 10 do
while pocket[3] is not empty − > true
A[0] = get first node of pocket[3] and delete it
count = count + 1
while pocket[3] is not empty − > true
A[1] = get first node of pocket[3] and delete it
count = count + 1
while pocket[3] is not empty − > false
done
done
for j = 4 to 10 do
while pocket[4] is not empty − > true
A[2] = get first node of pocket[4] and delete it
count = count + 1
while pocket[4] is not empty − > true
A[3] = get first node of pocket[4] and delete it
count = count + 1

11
while pocket[4] is not empty − > false
done
done
for j = 5 to 10 do
while pocket[5] is not empty − > false
done
done
for j = 6 to 10 do
while pocket[6] is not empty − > true
A[4] = get first node of pocket[6] and delete it
count = count + 1
while pocket[6] is not empty − > false
done
done
for j = 7 to 10 do
while pocket[7] is not empty − > true
A[5] = get first node of pocket[7] and delete it
count = count + 1
while pocket[7] is not empty − > false
done
done
for j = 8 to 10 do
while pocket[8] is not empty − > true
A[6] = get first node of pocket[8] and delete it
count = count + 1
while pocket[8] is not empty − > false
done
done
for j = 9 to 10 do
while pocket[9] is not empty − > false
done
done
for j = 10 to 10 do
while pocket[10] is not empty − > false
done
done

12
for i = 3 to 3 - 1 do − > false

13

También podría gustarte