tri d'un tableau 1D c++

tri d'un tableau 1D c++ - C++ - Programmation

Marsh Posté le 20-02-2005 à 11:44:56    

Bonjour à tous,  
 
Quelqu'un pourrait m'aider à trier ce tableau en c++ comme suit:  
 
tab={-1, -1, 0,0 ,17,25,-1,8,0,28} en tab={-1,-1,0,0,2,3,-1,1,4 }.  
C'est à dire à reassigner les elements du tableau par ordre de grandeur sans toucher aux 0 et -1.  
Je suis confronté à un debordement de capacité de type int, ce qui m'oblige à reassigner mon tableau à chaque iteration.  
 
Je vous remercie d'avance.
 

Reply

Marsh Posté le 20-02-2005 à 11:44:56   

Reply

Marsh Posté le 20-02-2005 à 11:56:07    

ça n'est pas un tri. si tu veux faire un tri, extrait d'abord tes -1 et 0, tri le résultat, puis fusionne.
 
std::sort en tête

Reply

Marsh Posté le 20-02-2005 à 12:22:52    

Merci pour ton indication. Mais en fait, si j'extrais les -1 et 0, trie et fusionne, j'aurai plus l'ordre que je souhaite avoir.

Reply

Marsh Posté le 20-02-2005 à 12:29:04    

ben si

Reply

Marsh Posté le 20-02-2005 à 12:47:36    

Bon voilà, je vais donner des details. En fait, il s'agit de chercher mis à part les -1 et 0, le minimum du tableau lui assigner 1 (à cette position), refaire la recherche du minimum sur le reste, lui assigner deux (à cette position) ainsi de suite jusqu'à ce que le tableau soit reassigné en entier.
Merci.

Reply

Marsh Posté le 20-02-2005 à 13:29:21    

ben tu cris ton algo de tri voir mieux ton propre foncteur de tri pour le passer a std::sort [:dawa]

Reply

Marsh Posté le 20-02-2005 à 13:34:02    

Joel F a écrit :

ben tu cris ton algo de tri voir mieux ton propre foncteur de tri pour le passer a std::sort [:dawa]


ça ne peut pas marcher

Reply

Marsh Posté le 20-02-2005 à 23:54:38    

pardon o_O ??

Reply

Marsh Posté le 21-02-2005 à 01:09:35    

je ne comprend pas bien la demande :
il s'agit bien de remplacer le nombre par son rang en écartant les -1 et les 0 ...
 
Si oui, quel est l'algo que tu as utilisé pour savoir?

Reply

Marsh Posté le 21-02-2005 à 09:25:59    

Tu peux essayer ceci :
 

Code :
  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. int main()
  5. {
  6.   int tab[10] = {-1,0,3,-5,0,-1,2,-1,-4,0};
  7.   int* tab1;
  8.   int i,taille;
  9.   list<int> list_0,list_1,list_f;
  10.   list<int>::iterator it,it0,it1;
  11.  
  12.   // Calcul de la taille du tableau (si initialement inconnue)
  13.  
  14.   taille = sizeof(tab)/sizeof(int);
  15.  
  16.   // Remplissage des listes list_1, list_0, list_f
  17.  
  18.   for(i=0;i<taille;i++)
  19.     {
  20.       if (tab[i] == -1)
  21. {
  22.   list_1.push_back(i);
  23. }
  24.       else if (tab[i] == 0)
  25. {
  26.   list_0.push_back(i);
  27. }
  28.       else
  29. {
  30.   list_f.push_back(tab[i]);
  31. }
  32.     }
  33.  
  34.   // Tri de list_f
  35.  
  36.   list_f.sort();
  37.   // Retour des -1 et des 0 à leurs positions initiales
  38.  
  39.   it = list_f.begin();
  40.   it1 = list_1.begin();
  41.  
  42.   it0 = list_0.begin();
  43.  
  44.   tab1 = new int[taille];
  45.   for(i=0;i<taille;i++)
  46.     {
  47.       if ((*it1) == i)
  48. {
  49.   tab1[i] = -1;
  50.   it1++;
  51. }
  52.       else if ((*it0) == i)
  53. {
  54.   tab1[i] = 0;
  55.   it0++;
  56. }
  57.       else
  58. {
  59.   tab1[i] = (*it);
  60.   it++;
  61. }
  62.     }
  63.  
  64.   // Affichage de la liste list_f
  65.   for(i=0;i<taille;i++)
  66.     {
  67.       cout << tab1[i] << endl;
  68.     }
  69. }


 
Le tableau tab est initialisé ici mais on peut le remplir comme souhaité. Sa taille est ensuite calculée. On le parcours et, en différenciant les valeurs des éléments, on remplit 3 tableaux différemments. Seul le dernier est trié (list_f). Le tableay tab1 contient le résultat final car il a été remplis différemment selon l'indice de l'élément.
 
Cordialement

Reply

Marsh Posté le 21-02-2005 à 09:25:59   

Reply

Marsh Posté le 21-02-2005 à 09:27:26    

Bon, l'indentation est pas très bien passée et il faut lire :
 
// Affichage du tableau tab1  
 
à la fin (le commentaire est incorrect)

Reply

Marsh Posté le 21-02-2005 à 11:39:14    

vous faites chier à lui faire ses devoirs

Reply

Marsh Posté le 23-02-2005 à 10:40:31    

Bonjour à tous, merci aux contributions, merci nathan_g.
Je reexpose le problème car çà n'est pas du tout un tri normal comme l'a traité nathan mais plutôt il s'agit bien de remplacer le nombre par son rang en écartant les -1 et les 0 dans le même tableau à leur position evidemment.  
En fait, j'utilise un algorithme de parcours sur les graphes où à chaque fois je choisis le sommet en fonction de son etiquette. L'étiquette i étant la valeur du tableau correspondant au somme i. En triant, on ne doit pas decaler les valeurs, sinon on ne saurait à quel sommet telle ou telle etiquette correspond. Ensuite, le but c'est de transformer le tableau d'etiquettes en tableau de rang à chaque iteration car les etiquettes croissant vite, on risque un debordement.
Cordialement

Reply

Marsh Posté le 23-02-2005 à 20:29:07    

Bonjour,
 
je pense qu'une méthode de tri standard est la bonne...
Il faudrait faire qqch du style :
- en une passe du tableau initial : construire un tableau de pointeurs sur une structure (ou classe comme on veut) qui contient à la fois la valeur et la position dans le tableau original (pour les valeurs strictement positives)
- on applique un tri sur le tableau obtenu (tri rapide ou tri fusion...) : quelque chose de similaire à ce qui est fait là haut.
- on reparcourt le tableau trié pour mettre le rang dans la position mise dans la structure...
 
Je pense pas que ça soit trop compliqué à mettre en oeuvre...
 
++

Reply

Marsh Posté le 24-02-2005 à 09:44:38    

Je reexpose le problème car çà n'est pas du tout un tri normal comme l'a traité nathan mais plutôt il s'agit bien de remplacer le nombre par son rang en écartant les -1 et les 0 dans le même tableau à leur position evidemment.  
 
J'ai pas tout compris ...
 
En fait, si je considère ton exemple du début (même s'il manque un morceau), tu demande à ce qu'on remplace les éléments différents de -1 et 0 par l'indice de leur rang dans la liste " list_f " triée (compté à partir de 1) ?
J'ai bon ?
 
Dans ce cas (après qqs correction aussi sur le programme initial) :
 

Code :
  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. class Couple
  5. {
  6. public:
  7.   Couple() {}
  8.  
  9.   Couple(int init_rang,int init_val) {_rang = init_rang;_val = init_val;}
  10.   int rang() {return (_rang);}
  11.   int val()  {return (_val);}
  12.  
  13. protected:
  14.   int _rang;
  15.  
  16.   int _val;
  17. };
  18. struct Compar
  19.   bool operator()(Couple left,Couple right)
  20.     { 
  21.       return ((left.val())<(right.val())); 
  22.     } 
  23. };
  24. int main()
  25. {
  26.   int tab[10] = {-1,0,3,-5,0,-1,2,-1,-4,0};
  27.   int* tab1;
  28.   int i,jf,taille;
  29.   list<Couple> list_0,list_f;
  30.   list<Couple>::iterator it0,itf;
  31.  
  32.   // Calcul de la taille du tableau (si initialement inconnue)
  33.  
  34.   taille = sizeof(tab)/sizeof(int);
  35.  
  36.   // Remplissage des listes list_1, list_0, list_f
  37.  
  38.   for(i=0;i<taille;i++)
  39.     {
  40.       if (!(tab[i] == -1 || tab[i] == 0))
  41. {
  42.   // Enregistrement de la valeur et du rang
  43.  
  44.   list_f.push_back(Couple(i,tab[i]));
  45. }
  46.     }
  47.  
  48.   // Tri de list_f
  49.  
  50.   list_f.sort(Compar());
  51.   // Retour des -1 et des 0 à leurs positions initiales
  52.   it0 = list_0.begin();
  53.   jf = 1;
  54.  
  55.   itf = list_f.begin();
  56.  
  57.   tab1 = new int[taille];
  58.   for(i=0;i<taille;i++)
  59.     {
  60.       if (tab[i] == -1 || tab[i] == 0)
  61. {
  62.   // Retour d'une valeur -1 ou 0 dans la liste
  63.  
  64.   tab1[i] = tab[i];
  65. }
  66.       else
  67. {
  68.   // Retour de l'indice
  69.  
  70.   tab1[(*itf).rang()] = jf;
  71.   jf++;
  72.  
  73.   itf++;
  74. }
  75.     }
  76.  
  77.   // Affichage de la liste list_f
  78.   for(i=0;i<taille;i++)
  79.     {
  80.       cout << tab1[i] << endl;
  81.     }
  82. }


 
Je sais qu'il y a qqs problèmes de syntaxes (notamment des const qui manquent ...) mais ça doit fonctionner.
PS: Si tu as Visual C++ 6.0 comme moi, inutile d'essayer, ça ne fonctionnera pas. Même bien écrit, un tri de list avec un foncteur donne un tri faux ! Par contre, sous gcc ce programme a l'air de marcher.

Reply

Sujets relatifs:

Leave a Replay

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