Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1197 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  tri d'un tableau 1D c++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tri d'un tableau 1D c++

n°987539
beni46
Posté le 20-02-2005 à 11:44:56  profilanswer
 

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.
 

mood
Publicité
Posté le 20-02-2005 à 11:44:56  profilanswer
 

n°987546
Taz
bisounours-codeur
Posté le 20-02-2005 à 11:56:07  profilanswer
 

ç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

n°987562
beni46
Posté le 20-02-2005 à 12:22:52  profilanswer
 

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.

n°987567
Taz
bisounours-codeur
Posté le 20-02-2005 à 12:29:04  profilanswer
 

ben si

n°987582
beni46
Posté le 20-02-2005 à 12:47:36  profilanswer
 

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.

n°987601
Joel F
Real men use unique_ptr
Posté le 20-02-2005 à 13:29:21  profilanswer
 

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

n°987603
Taz
bisounours-codeur
Posté le 20-02-2005 à 13:34:02  profilanswer
 

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

n°987986
Joel F
Real men use unique_ptr
Posté le 20-02-2005 à 23:54:38  profilanswer
 

pardon o_O ??

n°988015
dreameddea​th
Posté le 21-02-2005 à 01:09:35  profilanswer
 

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?

n°988065
nathan_g
Posté le 21-02-2005 à 09:25:59  profilanswer
 

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

mood
Publicité
Posté le 21-02-2005 à 09:25:59  profilanswer
 

n°988068
nathan_g
Posté le 21-02-2005 à 09:27:26  profilanswer
 

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

n°988186
Taz
bisounours-codeur
Posté le 21-02-2005 à 11:39:14  profilanswer
 

vous faites chier à lui faire ses devoirs

n°990874
beni46
Posté le 23-02-2005 à 10:40:31  profilanswer
 

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

n°991802
dreameddea​th
Posté le 23-02-2005 à 20:29:07  profilanswer
 

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...
 
++

n°992051
nathan_g
Posté le 24-02-2005 à 09:44:38  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  tri d'un tableau 1D c++

 

Sujets relatifs
jsp +tableau[debutant] tableau java
[VB] Initialisation d'un tableau multidimentions ?Creer un tableau depuis une boucle
[Html] Taille fixe de tableauPasser un tableau à un script cgi
Debutant CSS definir different sytle pour des cellule de tableau ?div et tableau
pb d'image dans tableauMettre en couleur une ligne sur deux dans un tableau;
Plus de sujets relatifs à : tri d'un tableau 1D c++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR