Accueil > Forum > > > > Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension
Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension
mardi 8 novembre 2011 à 18:15:44 |
Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension

Askirkela
|
Bonjour à tous.
Premièrement, j'espère que ce message est au bon endroit (qui m'a parut le plus logique, bien que l'algorithmique soit de mise).
Deuxièmement, je vous expose mon problème (en C++, si possible) :
- Je dispose d'un tableau d'entiers de dimension n*m rempli (int[10][3], par exemple)
- Je dois ensuite le trier par valeur croissante selon la valeur contenue dans tab[x][2] (les valeurs contenues dans tab[x][0] et tab[x][1] doivent suivre lors du tri, vu qu'elles sont associées à tab[x][2]).
J'ai donc essayé de recourir aux fonctions de la STL sans succès, à adapter un tri rapide, fusion, bulles, sans plus de succès.
Étant passablement mauvais en algorithmique et ayant passé un certain temps sur le problème, je me tourne vers vous en espérant ne pas passer pour un c*n.
Sinon, un petit trou de mémoire qui pourrait être comblé : comment un tel tableau est-il représenté en mémoire?
Mettons qu'on veut accéder à la valeur tab[4][2], comment la récupérer via les pointeurs? (tab+4+m+2? tab+4+2?...)
D'avance, merci à vous!
|
|
mardi 8 novembre 2011 à 19:03:07 |
Re : Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension

CptPingu
|
Bonjour.
Tu es au bon endroit :)
Si je puis me permettre, je pense que ta structure de données laisse à désirer. Pourquoi ne pas avoir un tableau de structure ?
Je vois plus un std::vector<MaStruct> avec MaStruct contenant 3 valeurs entières.
Il suffit alors d'appliquer un std::sort en précisant que la 3ème valeur est celle du tri.
Ce qui donnerait:
Code C/C++ :
#include <iostream>
#include <algorithm>
#include <vector>
struct MaStruct
{
MaStruct(int a, int b, int c)
: _a(a), _b(b), _c(c)
{
}
int _a;
int _b;
int _c;
};
void display(const std::vector<MaStruct>& tab)
{
for (std::vector<MaStruct>::const_iterator it = tab.begin();
it != tab.end(); ++it)
std::cout << it->_a << " " << it->_b << " " << it->_c << std::endl;
}
bool sortFunction(const MaStruct& obj1, const MaStruct& obj2)
{
return obj1._c < obj2._c;
}
int main()
{
std::vector<MaStruct> tab;
tab.push_back(MaStruct(3, 3, 3));
tab.push_back(MaStruct(2, 4, 4));
tab.push_back(MaStruct(8, 7, 5));
tab.push_back(MaStruct(6, 4, 3));
tab.push_back(MaStruct(2, 1, 2));
tab.push_back(MaStruct(1, 2, 1));
std::cout << "Before:" << std::endl;
display(tab);
std::sort(tab.begin(), tab.end(), sortFunction);
std::cout << "After:" << std::endl;
display(tab);
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
mardi 8 novembre 2011 à 19:13:36 |
Re : Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension

CptPingu
|
Mettons qu'on veut accéder à la valeur tab[4][2], comment la récupérer via les pointeurs? (tab+4+m+2? tab+4+2?...)
tab[4][2] équivaut à *(*(tab + 4) + 2) => On déréfence le premier tableau *(tab + 4), puis on déréfence le 2ème.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
mardi 8 novembre 2011 à 19:24:09 |
Re : Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension

pop70
|
Réponse acceptée !
Salut, sans passer par les fonctions de la stl (ce qui n'est pas forcément une bonne chose...) ce petit bout de code pourra peut-être t'aider, il crée un tableau, affiche un élément par opérateurs [] et par pointeurs, puis le trie le tableau.
Par contre la méthode de tri est sûrement moins performante que celle que te donne CptPingu avec std::sort, ici c'est juste un truc improvisé, les colonnes sont triées 2 à 2 jusqu'à ce que ce ne soit plus possible, puis ça passe à la ligne suivante:
Code C/C++ : #include <iostream>
int main()
{
bool tri;
int tab[5][4];
for (int i=0; i < 5; i++)
for (int j=0; j < 4; j++)
tab[i][j] = (i*j)%10; // Pour remplir le tableau un peu au hasard...
tab[3][2] = -1; // met -1 ligne 3 colonne 2
std::cout << "\n";
for (int i=0; i < 5; i++)
{
for (int j=0; j < 4; j++)
std::cout << tab[i][j] << " ";
std::cout << "\n";
}
std::cout << "\nAvec pointeurs : " << *(*(tab + 3) + 2); // *(*(tab + ligne) + colonne)
std::cout << "\nAvec operateurs [] : " << tab[3][2]; // cette ligne comme la précédente affiche -1.
for (int i=0; i < 5; i++) // pour le tri
{
tri=true;
while (tri)
{
tri=false;
for (int j=0; j < 4 - 1; j++)
{
if (tab[i][j] > tab[i][j+1])
{
tri=true;
int temp = tab[i][j];
tab[i][j] = tab[i][j + 1];
tab[i][j + 1] = temp;
}
}
}
}
std::cout << "\n\n";
for (int i=0; i < 5; i++) // réaffiche le tableau
{
for (int j=0; j < 4; j++)
std::cout << tab[i][j] << " ";
std::cout << "\n";
}
return 0;
}
C++dialement,
Pop70
|
|
mardi 8 novembre 2011 à 19:56:36 |
Re : Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension

LA_Tupac
|
Et voilà, quand on prend le temps de rédiger correctement une question réfléchie au préalable on a des réponses en moins d'une heure, et de grande qualité.
Certains posteurs devraient en prendre de la graine
+1
|
|
mardi 8 novembre 2011 à 22:32:39 |
Re : Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension

Askirkela
|
Bon, merci à vous pour vos réponses.
CptPingu, c'est certes plus agréable à l’½il et plus optimisé d'utiliser une structure et un vecteur, mais j'avais comme contrainte d'utiliser cette forme.
J'ai donc utilisé le code de Pop70 légèrement modifié pour mes besoins. Dans le doute, je le mets à la suite au cas où quelqu'un aurait un jour le même souci que moi.
(à savoir, les modifications concernent le côté fixe de la valeur à prendre en compte pour le tri. Mais en fin de compte, ça tient très fortement du bubble, j'suis juste hyper mauvais  )
Code C/C++ :
void triDuSujet(int m, int[][3]){
int temp1;
int temp2;
int temp3;
bool tri = true;
while (tri){
tri=false;
for (int i=0; i < m-1; i++){
if (edge[i][2] > edge[i+1][2]){
tri=true;
temp1 = edge[i][0];
temp2 = edge[i][1];
temp3 = edge[i][2];
edge[i][0] = edge[i+1][0];
edge[i][1] = edge[i+1][1];
edge[i][2] = edge[i+1][2];
edge[i+1][0] = temp1;
edge[i+1][1] = temp2;
edge[i+1][2] = temp3;
}
}
}
}
|
|
mercredi 9 novembre 2011 à 00:40:37 |
Re : Tri appliqué à un tableau à 2 dimensions basé sur la 2nde dimension

CptPingu
|
Merci d'avoir mis à jour ce topic en postant ta solution.
En revanche, pense à bien préciser tes contraintes, afin que l'on puisse t'aider au mieux :)
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
Cette discussion est classée dans : valeur, tableau, dimension, tri, tab
Répondre à ce message
Sujets en rapport avec ce message
tri dans un tableau a 2 dimension en cpp [ par vivo95 ]
Bonjours, je rechercherai comment faire pour faire un tri dans un tableau a 2 dimension, je sais le faire dans un tableua a 1 dim mais la je seche.Mer
passer un tableau de pointeurs en parametres [ par achirane ]
bonjour,je debute en C (dur..) et j'ai un pb qui va surement vous faire ricaner ;-) :je voudrais passer un tableau de pointeurs en parametre a ma fonc
Pb de pointeur [ par Jack94 ]
Salut a tous, Voila j'ai un pb je defini un tableau et tout et j'ai definie deux variable int a et b qui on pour valeur respectif les valeur ranger d
Tableau 2 dimension en fonction [ par acidjackproject ]
Bonjour, j'aimerai pas un tableau à 2 dimension en paramètre sans pointeurs. Quand je le fais (comme suit), il m'affiche "error:array type has incompl
Programme Tri à Bulle [ par tivanbelle ]
Bonjour,J'ai fait ce programme en cours, c'est un tri a bullequi tri des valeur donc 2à2, mais le programme ne fonctionne pas. Pouvez vous me dire ce
récuperer un indice dans un tableau [ par MBALHOUSSE ]
Bonjour,je souhaite récuperer l'indice d'un element d'un tableau;sachant que dans le cas ou la valeur n'existe pas dans le tableau je renvoie l'indice
tableau/procédure [ par nopnop77 ]
Bonjour !Voila j'ai un problème à passer un tableau en paramètre entrée/sortie pour une procédure.Voici un code simplifié:#include using namespace std
tableau static [ par MBALHOUSSE ]
salut,J'ai besoin de remplir un tableau static de 60 elements.il est trés facile d'écrir par exemple--------------------------------------------------
tableau à dimension variable [ par youssefmahdia ]
bonjour les amis,j'ai un problème en C, en fait, je veux créer un tableau à deux dimensions dont une est variable.voila, je veux obtenir quelque chose
tableau [ par MBALHOUSSE ]
bonjour 1) au fait, je veux programmer une fonction en C qui renvoie une valeur entier pour chaque motcad j'ai besoin d'un tableau de caractere comme
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|