selectionner une suite de chiffres dans une routine de tri C++

selectionner une suite de chiffres dans une routine de tri C++ - C++ - Programmation

Marsh Posté le 14-10-2019 à 21:01:05    

   Bonsoir,
 
    Soit la routine de tri suivante :
   
   

Code :
  1. int nombre[13];
  2.     int i, j;
  3.    
  4.     for (i = 1; i <14 ; ++i)
  5.        {
  6.         int elem = nombre[i];
  7.    
  8.         for (j = i; j > 0 && nombre[j-1] > elem; j--)
  9.    
  10.          nombre[j] = nombre[j-1];
  11.    
  12.         nombre[j] = elem;
  13.        }


   
    Admettons que le résultat soit 2,5,8,10, 15, 16 17, 20, 26 ,27 ,28, 31,45 ....
 
    Est-il possible de sélectionner uniquement les séries de chiffres qui se suivent (ex : 15,16,17 et 26,27,28) et d'enregistrer chaque série dans une variable différente ?
 
int variable1[13];
int variable2[13];
 
  for (int i = 1; i <14 ; ++i)
   if (nombre[i] = 15,16,17)
     {
      variable1[0] =15;
      variable1[1] =16;
      variable2[2] =17;
    }
idem pour variable2
 
  Je sais que ma question peut paraître étrange, mais j'aurais besoin de cette routine pour une petite appli
 
    Merci d'avance
 
    Cordialement  
 

Reply

Marsh Posté le 14-10-2019 à 21:01:05   

Reply

Marsh Posté le 14-10-2019 à 22:52:31    

Bonjour,
 

magdani a écrit :

Est-il possible de sélectionner uniquement les séries de chiffres qui se suivent (ex : 15,16,17 et 26,27,28) et d'enregistrer chaque série dans une variable différente ?


Oui, pourquoi tu ne pourrais pas ? :??:  
C'est interdit par la loi ? :o


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 15-10-2019 à 13:18:56    

Tant mieux alors. As-tu la solution ?

Reply

Marsh Posté le 16-10-2019 à 12:13:20    

Il a une sale tronche ton tri ..  
dans ta boucle la première ligne ne sert a rien :  

Code :
  1. nombre[j] = nombre[j-1];
  2. nombre[j] = elem;


 
 
Si tu veux coder ton tri, tu fais un tri bulle ou un tri par sélection, c'est assez simple.  
 
Exemple pour un tri bulle :  
tu compares tous les éléments du tableau 2 à 2 (0 et 1 puis 1 et 2 puis 2 et 3 etc, donc une boucle qui commence à 0 et s’arrête a la taille du tableau -1 et qui va comparer j et j+1 ) ce qui fait remonter le maximum à la dernière case.
On recommence autant de fois qu'il y a de case pour trier tout le tableau.  
 
Par exemple avec un petit tableau  : 8 5 3 4 9 au départ, on veut arriver a 3 4 5 8 9 à la fin  
Premier tour de boucle :  
9 5 3 4 8 -> 5 9 3 4 8 -> 5 3 9 4 8 -> 5 3 4 9 8 -> 5 3 4 8 9
 
Deuxième tour de boucle :  
5 3 4 8 9 -> 3 5 4 8 9 -> 3 4 5 8 9 -> 3 4 5 8 9 -> 3 4 5 8 9  : on remarque que sur ce tour de boucle on n'a pas besoin d'aller jusqu’à la fin du tableau, on sait déjà que le 9 est en dernière case à la fin de la première boucle, on peut donc optimiser la boucle en s’arrêtant une case plus tôt à chaque tour de boucle.
 
Troisième tour de boucle :  
3 4 5 8 9-> 3 4 5 8 9 -> 3 4 5 8 9 -> 3 4 5 8 9 -> 3 4 5 8 9 on a fait aucun échange, on optimise donc le code pour arrêter une fois que le tableau est trié sans attendre d'avoir fait le 4e tour de boucle.  
 
 
 
et ensuite pour ton problème, si tu ne sais pas faire d'allocation dynamique de variables, tu ne vas pas pouvoir vu que tu ne sais pas en avance combien il y a de variable à déclarer vu que tu ne sais pas combien il y aura de suite.  
 
Sinon il suffit juste de faire une boucle qui va stocker les éléments tant que les éléments sont à une valeur d'écart.
 

Reply

Marsh Posté le 16-10-2019 à 20:25:04    

Merci mathieu pour ta réponse. J'ai pensé aussi à une boucle qui stockera les éléments tant que les éléments sont à une valeur d'écart. Je me demandais si il n'y avait pas un autre moyen

Reply

Marsh Posté le 16-10-2019 à 21:30:50    

Tu peux inverser le sens de la recherche pour faire une optimisation statistique. Plutôt que de partir d'entités non groupées et de les regrouper, tu peux partir d'un seul groupe et de le dégrouper mais cela suppose de travailler avec des entiers classés sans possibilité de doublons.
Ainsi tu divises ton groupe à chaque fois que le nombre de la fin moins le nombre du début est différent du nombre de nombres moins un.
 
ex : 1 2 3 4 6 7 8 9
 
9 - 1 = 8
nombre de nombres - 1 = 8 - 1 = 7
8 <> 7
on exclue le 1
 
9 - 2 = 7
nombre de nombres - 1 = 7 - 1 = 6
7 <> 6
on exclue le 2
 
etc.
 
9 - 6 = 3
nombre de nombres - 1 = 4 - 1 = 3
3 = 3
on garde le groupe allant de 6 à 9.
 
On recommence pour le groupe de 1 à 4.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 17-10-2019 à 14:21:00    

Merci MaybeEijOrNo. Non il n'y a pas de doublons. Je vais essayer ta solution.

Reply

Marsh Posté le 17-10-2019 à 16:24:17    

Elle n'est pas forcément meilleure, cela dépend du nombre et de la taille des groupes attendue.
Mais comme bien souvent dans les algos de tri, la réponse apportée est statistique.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed