Tableau : Tri à Bulles

Tableau : Tri à Bulles - Java - Programmation

Marsh Posté le 06-08-2010 à 02:33:47    

Bonjour !
 
Je suis débutant en programmation et je m'amuse à réaliser "des petits exos types".
Ici, ce programme remplit un tableau tabInt de type int avec 5 valeurs aléatoires.
Puis il affiche ce tableau et demande si l'utilisateur désire trier ce tableau.
Jusque là tout est OK.
Mais là où celà bloque c'est au moment du tri, lorsque j'affiche mon tableau après l'avoir trier... ce n'est pas correctement trier...
 
Exemple d'affichage :
 
3 - 7 - 9 - 5 - 7
Voulez-vous trier ce tableau ? [oui] / [non]
oui
3 - 7 - 5 - 7 - 9
 
Mon code :
 

Code :
  1. import java.util.Random;
  2. import java.util.Scanner;
  3. public class tri {
  4. public static final int TAILLE = 5;
  5. static int[] tabInt = new int [TAILLE];
  6. public static void remplir(int tabInt[]){
  7.  int i;
  8.  Random alea = new Random();
  9.  for(i=0; i<TAILLE; i++){
  10.   tabInt[i] = alea.nextInt(10);
  11.  }
  12. }
  13. public static void trier(int tabInt[]){
  14.  boolean permut = false;
  15.  int tampon = 0;
  16.  int i;
  17.  while(!permut){
  18.   permut = false;
  19.   for(i=0; i<TAILLE-1; i++){
  20.    if(tabInt[i] > tabInt[i+1]){
  21.     tampon = tabInt[i];
  22.     tabInt[i] = tabInt[i+1];
  23.     tabInt[i+1] = tampon;
  24.     permut = true;
  25.    }
  26.   }
  27.  }
  28. }
  29. public static void affichage(int TabInt[]){
  30.  int i;
  31.  for(i=0; i<TAILLE; i++){
  32.   System.out.print(tabInt[i]);
  33.   if(i != TAILLE-1)
  34.    System.out.print(" - " );
  35.  }
  36. }
  37. public static void main(String [] args){
  38.  String reponse;
  39.  Scanner input = new Scanner(System.in);
  40.  remplir(tabInt);
  41.  affichage(tabInt);
  42.  System.out.println("\nVoulez-vous trier ce tableau ? [oui] / [non]" );
  43.  reponse = input.nextLine();
  44.  if (reponse.compareTo("oui" ) == 0){
  45.   trier(tabInt);
  46.   affichage(tabInt);
  47.  }
  48. }
  49. }


 
 
Merci pour vos réponses

Reply

Marsh Posté le 06-08-2010 à 02:33:47   

Reply

Marsh Posté le 06-08-2010 à 06:14:12    

Je ne sais coder en Java et il est tard mais il me semble voir le problème:
 

Code :
  1. public static void trier(int tabInt[]){
  2. boolean permut = false;
  3. int tampon = 0;
  4. int i;
  5. while(!permut){
  6. permut = false;
  7. for(i=0; i<TAILLE-1; i++){
  8.   if(tabInt[i] > tabInt[i+1]){
  9.    tampon = tabInt[i];
  10.    tabInt[i] = tabInt[i+1];
  11.    tabInt[i+1] = tampon;
  12.    permut = true;
  13.   }
  14. }
  15. }


 
En gros ton code c'est: Tant que permut est égal a false, on définit permut égal a false, ensuite on fait une boucle et si deux éléments doivent être inversés, permut est mis a true.
 
Le principe du tri a bulles, c'est de faire une boucle qui ne s'arrête dès qu'il ne reste plus d'inversions à effectuer dans le tableau a trier. Or dans ton cas, tu dis que dès qu'il faut inverser deux éléments de ce tableau, la boucle doit s'arrêter.
 
Perso je verrais plus un truc dans ce style:
 

Code :
  1. public static void trier(int tabInt[]){
  2. boolean permut = false;
  3. int tampon = 0;
  4. int i;
  5. while(!permut){
  6. permut = true;
  7. for(i=0; i<TAILLE-1; i++){
  8.   if(tabInt[i] > tabInt[i+1]){
  9.    tampon = tabInt[i];
  10.    tabInt[i] = tabInt[i+1];
  11.    tabInt[i+1] = tampon;
  12.    permut = false;
  13.   }
  14. }
  15. }


 
Ici la boucle ne va s'arrêter que si elle ne rentre pas dans la condition (puisque dès le début de la boucle on met permut a true, et que ta boucle ne continue que si permut est égal a false). Or, si ton algorithme ne rentre pas dans la boucle, c'est tout simplement qu'il n'y a plus de tri a effectuer donc on peut s'arrêter. [:transparency]


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 06-08-2010 à 10:37:29    

Pas mieux, Wiids a tout dit.
Et un p'tit conseil, tes variables, donne leur des noms qui te permettent de suite de te rappeler ce qu'elles représentent/à quoi elles servent.
Ca a l'air con, mais "permut", voilà quoi.
Alors que si tu l'avais appelé "ilYAEuUnePutainDePermutationPendantLaDerniereBoucle" par exemple, ben à chaque fois que tu vas écrire un test/une affectation, ca sera beaucoup plus clair pour toi.
(oui c'est exagéré mais l'idée est là)


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 06-08-2010 à 11:42:36    

Merci beaucoup de m'avoir éclairci du coup en réflichissant un peu je trouve ça mieux de faire :
 

Code :
  1. public static void trier(int tabInt[]){
  2.  boolean permut = false;
  3.  int tampon = 0;
  4.  int i;
  5.  do{
  6.   permut = false;
  7.   for(i=0; i<TAILLE-1; i++){
  8.    if(tabInt[i] > tabInt[i+1]){
  9.     tampon = tabInt[i];
  10.     tabInt[i] = tabInt[i+1];
  11.     tabInt[i+1] = tampon;
  12.     permut = true;
  13.    }
  14.   }
  15.  }while(permut == true);
  16. }


 
On continue à boucler tant qu'il y a des permutations  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed