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

Java Discussion :

tri par fusion & trace


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Par défaut tri par fusion & trace
    Bonsoir tout le monde,
    j'aimerais comprendre le fonctionnement de la récursivité multiple utilisé dans l'algorithme de tri par fusion.
    voici un code java implantant le tri par fusion(merge sort):
    Code : 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
     
    package sort;
    public class MergeSort {
    	 int data[];
     
        public MergeSort() {
        	data= new int []{7,5,3,2,0,6,1,4};
    	}
     
    	public void sort(){
    		sortArray(0,data.length-1);
    	}
    	private void sortArray(int low, int high){
    		if((high - low)>=1){
    			int m = (low + high)/2;
    			sortArray(low,m);
    			sortArray(m+1,high);
    			merge(low,m,high);
     
    		}
     
    	}
     
    	private void merge(int l,int m, int h ){
    		int [] temp= new int[data.length];
    		int left = l;
    		int right=m+1;
    		int index =l;
    		//System.out.println("merging");
    		while((left<=m)&&(right <= h) ){
    		if(data[right]<data[left]){
    			temp[index++]=data[right++];
    		}
    		else{
    			temp[index++]=data[left++];
     
    		}
    		}
    		if(left==m+1){
    		while(right<=h)
    			temp[index++]=data[right++];
    		}
    		else
    		{
    			while(left<=m)
    				temp[index++]=data[left++];
    		}
     
     
    		for(int i=l;i<=h;i++)
    			data[i]=temp[i];
    	}
     
     
    	public void afficher(int l, int h){
    		for(int k=l;k<h;k++)
    		System.out.print(data[k]+" ");
    		System.out.println();
    	}
     
    	public static void main(String[] args) {
    		MergeSort ms = new MergeSort();
    		ms.afficher(0,ms.data.length);
    		ms.sort();
    		System.out.println("fin tri ...!");
    		ms.afficher(0,ms.data.length);
    		}
     
     
    }
    j'ai fait l'exécution pas à pas (debug), mais malheureusement je n'arrive pas à comprendre les appels récursives. si quelqu'un à une idée comment dérouler ce programme.
    merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Par défaut
    Bonjour,

    la question qui se pose est la suivante:
    quand la condition d’arrêt de la récursivité est vrai(le cas par exp: low=0, high=0 ), que fait le compilateur? la réponse: il appel la deuxième méthode: mais avec quelles valeurs pour low, et high? (0+1,0) ?
    deuxième question: pour une récursivité multiple, combien de piles le compilateur va créer? pour notre cas: deux ou plus.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par win_ubuntu Voir le message
    quand la condition d’arrêt de la récursivité est vrai(le cas par exp: low=0, high=0 ), que fait le compilateur? la réponse: il appel la deuxième méthode:
    Ah bon ? Tu pourrais nous expliquer pourquoi ça fait ça ?

    Citation Envoyé par win_ubuntu Voir le message
    deuxième question: pour une récursivité multiple, combien de piles le compilateur va créer? pour notre cas: deux ou plus.
    Le compilateur ne crée pas de pile. Mais si on appelle une "pile" un "travail qui se fait en empilant des choses," il y en a bien plus de deux, à moins que le tableau de départ soit de taille 1 ou moins.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ah bon ? Tu pourrais nous expliquer pourquoi ça fait ça ?
    ce n'est pas le compilateur mais le JRE. c-à-d: quand le test if(high - low)>=1 vaut false.

    Citation Envoyé par thelvin Voir le message
    Le compilateur ne crée pas de pile. Mais si on appelle une "pile" un "travail qui se fait en empilant des choses," il y en a bien plus de deux, à moins que le tableau de départ soit de taille 1 ou moins.
    c-à-d: à chaque appel récursive de la méthode sortArray(int, int), on empile les paramétrés avec leurs valeurs. on dépile les paramétrés avec leurs valeurs à chaque fin d'appel récursive.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ok. Et alors ?
    Pour les deux...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Tri par fusion
    Par meoliver dans le forum Pascal
    Réponses: 8
    Dernier message: 06/02/2011, 13h09
  2. Tri par fusion
    Par marsilla02 dans le forum Pascal
    Réponses: 2
    Dernier message: 06/02/2008, 19h38
  3. Réponses: 9
    Dernier message: 12/09/2007, 12h56
  4. Tri par fusion
    Par ousunas dans le forum Langage
    Réponses: 3
    Dernier message: 25/02/2006, 02h52
  5. Tri par fusion d'un tableau
    Par Mailgifson dans le forum C
    Réponses: 5
    Dernier message: 12/12/2002, 14h53

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