/* Tri par selection d'un tableau de positions */ /* en trois dimensions en fonction */ /* de leurs distances a l'origine */ public class TriSelectionTableauDePosition3D { ////////////////////////////////////////////////// /* Type agrege de stockage des informations */ /* relatives a une position en trois dimensions */ static class Position3D { double x = 0.0; double y = 0.0; double z = 0.0; }; /* Fonction de calcul de la distance */ /* entre une Positon3D et l'origine */ static double distanceOrigine(Position3D p) { double d = Math.sqrt(p.x*p.x+p.y*p.y+p.z*p.z); return d; } /* Fonction de recherche de l'indice de la valeur */ /* maximale d'un tableau de Position3D restreint */ /* a ses n premieres valeurs */ static int indiceDuMaximum(int n,Position3D [] t) { double max = distanceOrigine(t[n]); int iMax = n; double d; for ( int i = n-1 ; i >= 0 ; i-- ) { d = distanceOrigine(t[i]); if ( d > max ) { max = d; iMax = i; } } return iMax; } /* Fonction de tri par selection d'un tableau */ /* de Position3D en fonction de la distance */ /* a l'origine */ static void triSelectionTableauDePosition3D(Position3D [] t) { Position3D aux; int iMax; for ( int i = t.length-1 ; i > 0 ; i-- ) { iMax = indiceDuMaximum(i,t); if ( iMax != i ) { aux = t[iMax]; t[iMax] = t[i]; t[i] = aux; } } } ////////////////////////////////////////////////// /* Affichage d'une Position3D formatee (x,y,z) */ static void afficher(Position3D p) { System.out.format("(%5.3f, %5.3f, %5.3f)",p.x,p.y,p.z); } /* Fonction d'affichage d'un tableau */ /* de Position3D (avec distances à l'origine) */ static void affichage(Position3D [] tp) { for ( int i = 0 ; i < tp.length ; i++ ) { afficher(tp[i]); Ecran.afficherln(" - ",distanceOrigine(tp[i])); } } /* Fonction de creation d'une Position3D tiree */ /* placee au hasard dans le cube de diagonale */ /* (0.0,0.0,0.0) - (10.0,10.0,10.0) */ static Position3D position3DAleatoire() { Position3D p = new Position3D(); p.x = 10.0*Math.random(); p.y = 10.0*Math.random(); p.z = 10.0*Math.random(); return(p); } /* Programme principal */ public static void main(String [] args) { int n; Position3D [] tp; Ecran.afficher("Nombre de Position3D ? "); n = Clavier.saisirInt(); tp = new Position3D[n]; for ( int i = 0 ; i < n ; i++ ) { tp[i] = position3DAleatoire(); } Ecran.sautDeLigne(); affichage(tp); Ecran.sautDeLigne(); triSelectionTableauDePosition3D(tp); affichage(tp); } }