Créer un tableau sans doublons
Bonjour, :D
- La recherche de doublons n'exige-t-elle pas de comparer la valeur testée au rang (i) à toutes celles situées plus loin (j>i) ?
- Est-il indispensable de travailler simultanément sur deux listes ?
Ne pourrait-on pas associer à toute liste de taille initiale (Tini) donnée une autre comportant un terme supplémentaire, dont la valeur (Max) dépasse arbitrairement celle de tous les autres ? Son initialisation ne présente aucune difficulté:
Code:
1 2 3 4 5 6 7 8 9 10 11
| CONST Tini = 18;
TYPE TabN0V = ARRAY[0..Tini - 1] OF Type_Entier;
TabN1V = ARRAY[0..Tini] OF Type_Entier;
VAR Liste0: TabN0V;
Liste1: TabN1V;
... / ... // Initialisation de Liste0
FOR k:= 0 TO Tini DO
IF (k=Tini) THEN Liste1[k]:= Max
ELSE Liste1[k]:= Liste0[k]; |
Trois boucles imbriquées devraient permettre l'exécution du tri demandé:
Code:
1 2 3 4 5 6 7
|
FOR i:= 0 TO (Tini - 2) DO
FOR j:= (i + 1) TO (Tini - 1) DO
IF (Liste1[i]=Liste1[j]) THEN // Détection du doublon (i, j)
FOR k:= (j) TO (Tini - 1) DO
Liste1[k]:= Liste1[k + 1] // Suppression du terme de rang (j) par
// saut de tous les suivants d'une case à gauche |
Ainsi la liste initiale de 18 termes:
(01, 28, 02, 05, 03, 10, 16, 28, 33, 12, 37, 05, 17, 28, 12, 49, 10, 33)
devrait conduire sauf erreur à:
(01, 28, 02, 05, 03, 10, 16, 33, 12, 37, 17, 49, M, M, M, M, M, M, M)
où le nombre de doublons apparaît immédiatement (6, dans le cas présent).