IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Tri rapide sur une liste chaînée


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2015
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Tri rapide sur une liste chaînée
    Bonjour à tous, j'ai besoin de votre aide pour solutionner un algo de tri par insertion en java sur listes chaînées

    merci d'avance pour votre temps et votre lecture.



    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    //methode qui retourne une liste des valeurs <= e
    	public Liste_chaînée Less_or_equals(int e){
     
    		Cellule c = tete;
    		Liste_chaînée l = new Liste_chaînée();
     
    		while(c!=null){
     
    			if (c.valeur <= e)
    				l.Cons(c.valeur); //cons ajoute une valeur en début de liste
     
    			c = c.suivant;
     
    		}
     
    		return l;
     
    	}
     
    	//retourne une liste des valeurs > e
    	public Liste_chaînée More_than(int e){
     
    		Cellule c = tete;
            Liste_chaînée l = new Liste_chaînée();
     
    		while(c!=null){
     
    			if (c.valeur > e)
    				l.Cons(c.valeur);
     
    			c = c.suivant;
     
    		}
     
    		return l;
     
    	}
     
    	//methode qui va concaténer toutes les listes crées et triées
    	public Liste_chaînée Concatener (Liste_chaînée l1, Liste_chaînée l2){
     
    		Liste_chaînée l = new Liste_chaînée();
     
    		if(l1 != null)
    			l = l1;
     
    		if (l2 != null){
     
    			Cellule tmp = l2.tete;
     
    			while (tmp !=null){
     
    				l.Snoc(tmp.valeur);
    				tmp=tmp.suivant;
    			}
    		}
     
    		return l;
    	}
     
    	//methode de tri rapide
    	public Liste_chaînée Tri_rapide (){
     
    		if (tete == null || tete.suivant == null)
    			return this;
     
    		else {
     
     
    		Liste_chaînée l1 = Less_or_equals(tete.valeur);
    		Liste_chaînée l2 = More_than (tete.valeur);
     
    		l1 = l1.Tri_rapide();
    		l2 = l2.Tri_rapide();
     
     
     
    		return Concatener(l1,l2);
    	    }
     
    	}

    l'exe :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     System.out.println("\n\n* Tri rapide *");
    	    Liste_chaînée l2 = new Liste_chaînée();
    	    l2.Init(10); // crée une liste de 10 occurrences
    	    l2.Afficher();
    	    System.out.println("\nListe triee : ");    
    	    l2.Tri_rapide();
    	    l2.Afficher();

    les classes liste et cellule sont difinies comme suit :



    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Cellule {
     
    	public int valeur;
    	public Cellule suivant;
     
    	//constructeur
    	Cellule(int _valeur){
     
    		valeur = _valeur;
    		suivant = null;
    	}
     
    }

    et

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Liste_chaînée {
     
    	public Cellule tete;
     
     
    	//constructeur
    	 Liste_chaînée(){
     
    		tete = null;
     
    	}

    Bien j'espère avoir mis assez de détails, étant novice en algo !

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Et quel est ton problème ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2015
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Bonsoir, veuillez pardonner mon temps de réponse,
    -> mon premier problème était :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Liste triee : 
    Exception in thread "main" java.lang.StackOverflowError
    	at TD.Liste_chaînée.Tri_rapide(Liste_chaînée.java:409)
    	at TD.Liste_chaînée.Tri_rapide(Liste_chaînée.java:412)
    ...
    ...
    ...

    Après plusieurs test le soucis vient de la méthode less_or_equals, sur l'affection de c :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    Cellule c = tete.suivant; // au lieu de Cellule c = tete;

    J'ai un peu de mal sur le cheminement donc je ne comprends pas pourquoi de décalage

    -> second soucis : une fois le code modifié comme ci dessus, la méthode Afficher() me renvoie bien la liste mais absolument pas triée.

    Merci d'avance.
    Bon code

Discussions similaires

  1. Tri conditionnel d'une liste chaînée
    Par floopi51 dans le forum Débuter
    Réponses: 4
    Dernier message: 04/03/2013, 16h26
  2. tri sur une list
    Par lastrecrue dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2007, 08h44
  3. select sur une liste chaînée
    Par wtfu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 01/06/2006, 15h30
  4. Réponses: 16
    Dernier message: 19/11/2005, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo