Rechercher : dans
Par :

[c++] tri de tableau

Dernière réponse le 18 déc 2006 à 00:42:18 robert, le 16 déc 2006 à 22:40:31 
 Signaler ce message aux modérateurs

Bonsoir,
j'aimerais faire un tri d'un tableau contenant des types point composé de x (ordonné) et de t (le temps), et j'aimerais trier le tableau efficacement
en ordre croissant en fonction de t plus précisément trier le tableau pointé par pv. voici mon code dont je vous épargne son intégralité
Merci d'avance

class Point {
public:
double x, t;
Point( double x = 0.0, double t= 1) : x(x), t(t) {}
friend Point milieu( const Point & p, const Point & q);
friend Point gauss2D( const Point & moy = Point(), double sig2 = 1.0);
};
struct Brown2D {
Point q;
Brown2D *s;
};
Point milieu( const Point & p, const Point & q) {
double x = (p.x + q.x)/2.0;
double t = (p.t + q.t)/2.0;
return Point(x,t);
}


int main() {
srand( time(0));

Brown2D B1 = { Point(gauss2D()), 0 },//considérer B1 et B0
B0 = { Point(0,0), &B1 };//comme despoints
Brown2D *pg, *pm, *pd; // pointeurs gauche, milieu, droite
int N=3;
Point *pv=new Point [N];
pv[0]=Point(0,0);
pv[N-1]=B1.q;
for ( int n = 1 ; n < N ; n ++ ) {
for ( pg = &B0 ; pd = pg->s ; pg = pd ) {
pm = new Brown2D;
pm->q = gauss2D( milieu( pg->q, pd->q),
abs(pd->q.t - pg->q.t)/4);
pv[n]=Point(pm->q.x,pm->q.t);//ici pv prend tous les points(x,t) mais dans le desordre
pm->s = pg->s;
pg->s = pm;
pm->q.plot();
}
}

}

Configuration: Windows XP
Firefox 2.0

Meilleures réponses pour « [c++] tri de tableau » dans :
Tri par fusion - récursivité- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri par fusion : Procedure Tri_Fusion (Var t : TAB; g, d : integer); Var m, i, j, k : integer; s : TAB; Begin If d > g Then ...
Tri à bulles -récursivité- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri à bulles : Procedure Tri_bulles (var t : TAB; n : integer); Var i, aux : integer; Function Trier (t : TAB; n : integer) : Boolean; ...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

1

Lapinkiller, le 16 déc 2006 à 23:17:44

En fait tu veu trier ton tableau du plus petit au plus grand c'est ca ? avec t comme reference de triage...
pour vos codes c/c++/... pensez à l'indentation
--
Lapinkiller, étudiant en BTS IRIS (informatique et réseaux...)
"La fin du monde n'est pas pour demain, elle est arrivée hier" (Lapinkiller)

Répondre à Lapinkiller

2

robert, le 16 déc 2006 à 23:26:20

Oue voila c'est tous a fait sa tu a une proposition....merci d'avance.

Répondre à robert

3

mamiemando, le 17 déc 2006 à 02:53:46

Il faut redéfinir l'opérateur < sur ta classe point ou définir un foncteur.
Exemple :

#include <set>
#include <iostream>

class Point{
  public:
  double x,t;
  Point(const double & x0,const double & t0):x(x0),t(t0){}
  //...
};

struct cmp_time{
  inline bool operator()(const Point & p1,const Point & p2){
    return p1.t < p2.t || (p1.t == p2.t && p1.x < p2.x);
  }
}

int main(){
  // Construire l'ensemble de points ordonnés sur le temps
  Point p1(3,5),p2(7,2),p3(6,9);
  std::set<Point,cmp_time> ens_pts;
  ens_pts.insert(p1);
  ens_pts.insert(p2);
  ens_pts.insert(p3);

  // Afficher l'ensemble de poitns
  std::set<Point,cmp_time>::const_iterator
    sit(ens_pts.begin()),send(ens_pts.end())
  for(;sit!=send;++sit){
    const Point & pcur = *sit;
    std::cout << pcur.x << '\t' << pcur.t << std::endl;
  }
  return 0;
}

Par defaut si le comparateur du set n'est pas spécifié, on utilise le foncteur par défaut qui repose sur le relation < (ici celle de la classe Point). Dans ton cas il faudrait définir l'opérateur < pour pouvoir écrire directement :
std::set<Point>

Exemple :
...
inline bool operator<(const Point & p1,const Point & p2){
  return p1.t < p2.t || (p1.t == p2.t && p1.x < p2.x);
}

int main(){
  std::set<Poiont> ens_points2;
  //...
  return 0;
}


Bonne chance

Répondre à mamiemando

4

Lapinkiller, le 17 déc 2006 à 14:38:12

Je pense qu'il y a plus simple

moi j'ai fait un tri d'un tableau a une dimension en une dizaine de lignes

en gros je prenais une case (la 1ere pour commencer) et je la comprai a celle d'apres et je permutait les deuc cases si l'une devait eytre avant ou apres l'autre (selon le tri que tu veu faire) une fois que j'avai comprarer la premier case avec celle d'apres je prenai la deuxieme case que je comparais avec celle d'apres et ainsi de suite jusqu'a l'avant dernier case ou la le tableau doit etre trie

j'ai creer une methode permuter
et sinon j'ai utiliser 2 boucle pour et un si (pour verifier si y'a besoin de permuter)

voila si ca peut t'aider... Lapinkiller, étudiant en BTS IRIS (informatique et réseaux...)
"La fin du monde n'est pas pour demain, elle est arrivée hier" (Lapinkiller)

Répondre à Lapinkiller

5

robert, le 17 déc 2006 à 17:09:16

Ok je vais essayer merci a tous pour vos conseils
bien cordialement

Répondre à robert

6

 mamiemando, le 18 déc 2006 à 00:42:18

Lapinkiller : Moi je donne la méthode générique et qui marche en O(log(n)), après chacun fait ce qu'il veut... Et la définition de l'opérateur < ou du foncteur tient en moins de dix lignes.

inline bool operator<(const Point & p1,const Point & p2){
  return p1.t < p2.t || (p1.t == p2.t && p1.x < p2.x);
}

Les foncteurs sont intéressant si un opérateur < a déjà été défini et qu'on souhaite utiliser une autre relation d'ordre pour trier le set. A noter que si les doublons sont autorisés dans la liste, il faut utiliser un multiset.

Bonne chance

Répondre à mamiemando