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 :

Algorithme d'insertion récursif


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Algorithme d'insertion récursif
    Bonjour,


    J'étudie l'algorithme par insertion récursif tel que le voici :

    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
     
    // Recursive function to sort an array using 
        // insertion sort 
        static void insertionSortRecursive(int arr[], int n) 
        { 
            // Base case 
            if (n <= 1) 
                return; 
     
            // Sort first n-1 elements 
            insertionSortRecursive( arr, n-1 ); 
     
            // Insert last element at its correct position 
            // in sorted array. 
            int last = arr[n-1]; 
            int j = n-2; 
     
            /* Move elements of arr[0..i-1], that are 
              greater than key, to one position ahead 
              of their current position */
            while (j >= 0 && arr[j] > last) 
            { 
                arr[j+1] = arr[j]; 
                j--; 
            } 
            arr[j+1] = last; 
        } 
     
        // Driver Method 
        public static void main(String[] args) 
        { 
            int arr[] = {12, 11, 13, 5, 6}; 
     
            insertionSortRecursive(arr, arr.length); 
     
            System.out.println(Arrays.toString(arr)); 
        } 
    }

    Et je ne comprends pas pourquoi l'auteur utilise cinq fois l'appel de la méthode insertionSortRecursive( arr, n-1 ) ligne 09 ?

    Que fait la machine ensuite de ces cinq insertionSortRecursive( arr, n-1 ). Restent-ils dans la mémoire ou bien servent-ils pour déplacer un simple curseur ?

    Merci pour toute réponse,

    Cordialement,

    Nino Adrien.

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 95
    Points : 212
    Points
    212
    Par défaut
    Salut,

    Citation Envoyé par Intelego Voir le message
    Et je ne comprends pas pourquoi l'auteur utilise cinq fois l'appelle de la méthode insertionSortRecursive( arr, n-1 ) ligne 09 ?
    C'est le principe du récursif d'appeler plusieurs fois la fonction.

    Au premier appel, cela fait: insertionSortRecursive({12, 11, 13, 5, 6}, 5); (5)
    qui appelle insertionSortRecursive({12, 11, 13, 5, 6}, 4); (4)
    qui appelle insertionSortRecursive({12, 11, 13, 5, 6}, 3); (3)
    qui appelle insertionSortRecursive({12, 11, 13, 5, 6}, 2); (2)
    qui appelle insertionSortRecursive({12, 11, 13, 5, 6}, 1); (1)
    avec:
    (1) qui retourne {[12],11,13,5,6},
    (2) qui retourne {[11,12],13,5,6},
    (3) qui retourne {[11,12,13],5,6},
    (4) qui retourne {[5,11,12,13],6},
    (5) qui retourne {[5,6,11,12,13]}.
    A chaque fois, c'est les éléments d'indices entre 0 et n-1 (que j'ai mis entre crochets) qui sont triés.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci,

    Cependant l'appel cinq fois de la méthode insertionSortRecursive( arr, n-1 ); semble faire que le tableau va être évalué de gauche à droite.

    Alors que int last = arr[n-1]; et int j = n-2; (ligne 14) et même j-- (ligne 23) semble faire que le tableau va être évalué (ou les tableaux devrais-je dire selon vous ?) dans le sens contraire, depuis la fin vers le début.

    C'est cette contradiction des sens des itérateurs qui me donne l’impression que tout les indices vont se bousculer, que la collision est imminente.

    Illusion d'esprit ?

    Intelego.

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 95
    Points : 212
    Points
    212
    Par défaut
    Si tu as mis le sujet en résolu, c'est que tu as compris finalement?

    Citation Envoyé par Intelego Voir le message
    C'est cette contradiction des sens des itérateurs qui me donne l’impression que tout les indices vont se bousculer, que la collision est imminente.
    J'ai lu itérateur? Les itérateurs sont justement pour les algorithmes itératifs, or là on est en récursif. Il faut voir les choses de manière plus globale.

    Citation Envoyé par Intelego Voir le message
    Cependant l'appel cinq fois de la méthode " insertionSortRecursive( arr, n-1 ); " semble faire que le tableau va être évalué de gauche à droite.
    Le tableau n'est pas "évalué de ... à ...", c'est directement des sous-tableaux "entiers" qui sont considérés: tous les tableaux d'indices 0 à k-1, avec k inférieur à la taille du tableau.

    Citation Envoyé par Intelego Voir le message
    Alors que " int last = arr[n-1];" et " int j = n-2; " (linge 14) et même "j--" (ligne 23) ...
    Ces opérations ne correspondent qu'à une étape de récursion, dans laquelle ont doit décaler une partie du tableau pour pouvoir insérer le nouvel élément.

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Dans le code initial, ajoute 2 lignes :
    En ligne 8, tu ajoutes [c]print ( "passage ligne 8 n=", n)|/c] et en ligne 13, tu ajoutes [c]print ( "passage ligne 13 n=", n)|/c] Ca devrait t'aider à voir ce qui se passe.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Salut,

    Je viens d'essayer ce que tu proposes tbc92, soit ajouter deux lignes tel que voici :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print ( "passage ligne 8 n=", n);
    print ( "passage ligne 13 n=", n);
    Cela donne ce code sur netbean si je suis bien :

    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
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package insr.java;
     
    import java.util.Arrays; 
     
    public class insr  { 
        // Recursive function to sort an array using 
        // insertion sort 
        static void insertionSortRecursive(int arr[], int n) 
        { 
            // Base case 
            if (n <= 1) 
                return; 
           print("passage ligne 13 n=", n);
            // Sort first n-1 elements 
            insertionSortRecursive( arr, n-1 ); 
     
            // Insert last element at its correct position 
            // in sorted array. 
         print("passage ligne 13 n=", n);
            int last = arr[n-1]; 
            int j = n-2; 
           // 12, 11, 13, 5, 6 
            /* Move elements of arr[0..i-1], that are 
              greater than key, to one position ahead 
              of their current position */
            while (j >= 0 && arr[j] > last) 
            { 
                arr[j+1] = arr[j]; // 12, 11, 13, 5, 6
                j--; 
            } 
            arr[j+1] = last; 
        } 
         // 12, 11, 13, 5, 6
        // Driver Method 
        public static void main(String[] args) 
        { 
            int arr[] = {12, 11, 13, 5, 6}; 
     
            insertionSortRecursive(arr, arr.length); 
     
            System.out.println(Arrays.toString(arr)); 
        } 
     
        private static void print(String passage_ligne_8_n, int n) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    }

    Et j'obtiens ce message d'erreur :

    Exception in thread "main" java.lang.UnsupportedOperationException: Not supported yet.
    	at insr.java.insr.print(insr.java:50)
    	at insr.java.insr.insertionSortRecursive(insr.java:18)
    	at insr.java.insr.main(insr.java:44)
    C:\Users\Kingdel\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 0 seconds)
    Pourtant voire apparaître plus de variables que ne le propose Netbean en mode "pas à pas" serait une source de compréhension appréciable. Peut-être tbc pourrais-tu préciser ta méthode ? Je voudrais bien comprendre ce que tu veux dire.

    Merci

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci AbsoluteLogic,


    Tes indications m'aide à mieux comprendre.

    Le compilateur Netbean montre que très peux de variables et encore moins qu'il y a cinq méthodes qui sont en attentes dans la machine.

    Quand a la mention" résolu" : je n'arrive pas à l'enlever en fait !

    Merci bien.

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    je propose print ( ) avec 2 paramètres... je ne connais pas la syntaxe précise ; il faut peut-être faire print ( "Passage ici " || n ) ... à toi de regarder la doc de la fonction print.

    Et dans ce que je disais, il faut mettre 2 textes différents selon que tu es AVANT l'appel à la fonction récursive ou APRES.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       String stringvalue = obj.toString(n); 
       System.out.println("Passage ici ... " +stringvalue);
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

Discussions similaires

  1. traitement d'insertion récursif
    Par buzzzy dans le forum Oracle
    Réponses: 10
    Dernier message: 10/08/2011, 15h57
  2. Réponses: 1
    Dernier message: 30/05/2011, 11h28
  3. Réponses: 2
    Dernier message: 04/04/2011, 15h54
  4. Tri d'insertion récursif
    Par WhiteTigerZ dans le forum Pascal
    Réponses: 5
    Dernier message: 05/04/2008, 21h13
  5. Quel algorithme pour insertion d'objets "triés" da
    Par phplive dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2005, 09h27

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