/* 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);
  }
}