J'ai entendu parler de Counting Sort et j'ai écrit ma version en fonction de ce que j'ai compris.Tri du comptage - différences d'implémentation
public void my_counting_sort(int[] arr)
{
int range = 100;
int[] count = new int[range];
for (int i = 0; i < arr.Length; i++) count[arr[i]]++;
int index = 0;
for (int i = 0; i < count.Length; i++)
{
while (count[i] != 0)
{
arr[index++] = i;
count[i]--;
}
}
}
Le code ci-dessus fonctionne parfaitement.
Cependant, l'algorithme donné dans CLRS est différent. Ci-dessous est ma mise en œuvre
public int[] counting_sort(int[] arr)
{
int k = 100;
int[] count = new int[k + 1];
for (int i = 0; i < arr.Length; i++)
count[arr[i]]++;
for (int i = 1; i <= k; i++)
count[i] = count[i] + count[i - 1];
int[] b = new int[arr.Length];
for (int i = arr.Length - 1; i >= 0; i--)
{
b[count[arr[i]]] = arr[i];
count[arr[i]]--;
}
return b;
}
J'ai traduit directement ce pseudocode en C#. Le code ne fonctionne pas et j'obtiens une exception IndexOutOfRange.
Mes questions sont les suivantes:
- Quel est le problème avec le deuxième morceau de code?
- Quelle est la différence d'algorithme entre ma mise en œuvre naïve et celle donnée dans le livre?
Qu'est-ce que vous utilisez pour votre entrée dans la deuxième version de 'counting_sort'? L'algorithme a certaines contraintes pour lesquelles les valeurs d'entrée sont autorisées. – Jacob
'int [] arr' contient des entiers compris entre 0 et 100. Je suis conscient que l'algorithme ne fonctionnera pas si des éléments en double sont présents. – rohit89