Tri d’un tableau par index : Débloquer le mystère avec C++

Le tri des tableaux est une tâche fondamentale en programmation, mais que faire si vous avez seulement besoin des index des valeurs triées plutôt que des valeurs triées elles-mêmes ? Ce problème courant a suscité l’intérêt de nombreux développeurs, en particulier ceux utilisant C ou C++. Dans cet article, nous allons démystifier la façon de trier un tableau par valeur tout en renvoyant les index des éléments dans l’ordre trié.

Le Défi

Imaginez que vous avez un tableau d’entiers, et votre objectif est de le trier dans l’ordre croissant. Cependant, au lieu de renvoyer les numéros triés eux-mêmes, vous voulez un tableau qui indique les indices d’origine de ces numéros triés. Par exemple, étant donné le tableau d’entrée :

Entrée :  1, 3, 4, 9, 6

La sortie devrait refléter les indices des valeurs triées :

Sortie : 1, 2, 3, 5, 4

Une Variation sur le Tri

Vous utilisez probablement un algorithme de tri comme la procédure de tri par coquille mentionnée dans la requête. Cependant, certaines implémentations de programmation peuvent entraîner des erreurs, notamment lors de la gestion des pointeurs. Cet article vise à clarifier comment travailler avec des tableaux en C/C++ et créer une fonction de tri qui répond aux exigences spécifiées.

Étape 1 : Créer un Tableau de Pointeurs

Pour faciliter le tri sans perdre d’informations positionnelles, nous pouvons créer un tableau de pointeurs qui pointent vers les éléments du tableau d’origine. Ainsi, lorsque nous trions les pointeurs, nous trions indirectement les valeurs du tableau d’origine tout en conservant la carte des indices. Voici comment vous pouvez le faire :

int* intArray; // Ceci sera initialisé avec vos valeurs entières.
int arrayLen;  // Longueur du tableau d'entiers.

int** pintArray = new int*[arrayLen]; // Créer un tableau de pointeurs.
for(int i = 0; i < arrayLen; ++i)
{
    pintArray[i] = &intArray[i]; // Pointer vers les éléments respectifs.
}

Étape 2 : Trier le Tableau de Pointeurs

Une fois que vous avez les pointeurs prêts, vous pouvez appliquer n’importe quel algorithme de tri (comme le tri par coquille) pour trier les pointeurs en fonction des valeurs auxquelles ils pointent. Voici une démonstration simple :

SortIntPointers(pintArray, arrayLen); // Trie le tableau des pointeurs en fonction des valeurs.

Étape 3 : Attribuer les Index Triés

Après avoir trié les pointeurs, vous pouvez alors les parcourir et attribuer leur position triée correspondante au tableau de pointeurs d’origine. Cela garantit que vous obtenez les index appropriés.

for(int i = 0; i < arrayLen; ++i)
{
    *pintArray[i] = i; // Attribuer les positions d'index triées.
}

Exemple d’Implémentation Complète

En mettant tout cela ensemble, voici un exemple complet suivant les étapes décrites ci-dessus :

void SortIntPointers(int** pArray, int ArrayLength) {
    int flag = 1;    
    int* temp;    
    
    for (int i = 1; (i <= ArrayLength) && flag; i++)
    {
        flag = 0;
        for (int j = 0; j < ArrayLength - 1; j++)
        {
            if (*pArray[j + 1] < *pArray[j]) // Changer pour ordre croissant
            { 
                temp = pArray[j]; // Échanger les éléments
                pArray[j] = pArray[j + 1];
                pArray[j + 1] = temp;
                flag = 1; // Un échange a eu lieu.
            }
        }
    }
}

// Initialisez et triez vos pointeurs comme démontré précédemment.

Conclusion

Trier des tableaux par index sans perdre de vue leurs positions d’origine peut être délicat, surtout avec des pointeurs en C/C++. En créant un tableau de pointeurs et en le triant, vous pouvez gérer efficacement ce défi. N’oubliez pas d’implémenter la gestion des erreurs et de considérer les cas limites pour un code plus robuste. Bonne programmation !