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 :

Trier un tableau et récupérer les indices dans l'ordre


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Trier un tableau et récupérer les indices dans l'ordre
    j'ai un tableau en entrée comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=[5,6,6,6,6,6,6,7,7,7,8,9,8,9,8,11,10,12,10,12,10,13,13]
    je veux trier ce tableau et récupérer les indices des nouveaux éléments triés par rapport au tableau initial A mais dans l'ordre
    c.à.d:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A_Tri=[5,6,6,6,6,6,6,7,7,7,8,8,8,9,9,10,10,10,11,12,12,13,13]
    Indice=[1,2,3,4,5,6,7,8,9,10,11,13,15,12,14,17,19,21,16,18,20,22,23]
    L'algorithme que j'ai écrit, le voici :
    Code matlab : 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
    for ii=1:taille(A)
     
     
          posenA(ii)=ii;
    end
    for i=1:Taille(A)-1
        wmin=i;
     
                for j=i+1:Taille(A)
                    if A(j)<A(wmin)
                        wmin=j;
                    end
                end
                    if wmin<>i 
                        aux= A(i);
                        A(i)=A(wmin);
                        A(wmin)=aux;
                        auxun=posenA(1,i);
                         posenA(1,i)=posenA(1,wmin);
                        posenA(wmin)=auxun;
     
                    end
     
     
    end



    permet de bien trier le tableau et récupérer les indices mais pas dans l'ordre.
    Voici le tableau indice résultant de mon algorithme Indice=[1,2,3,4,5,6,7,8,9,10,11,13,15,14,12,17,19,21,16,20,18,22,23]
    Quelqu’un SVP permet de me montrer l'erreur ou m'aider.MERCI

  2. #2
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    bjr;
    tu peux sauvegarder les indices initiales dans votre tableau ; a chaque permutation que tu fait dans le tableau A tu fait une permutation dans le tableau des indices .
    j’espère que je bien compris ce que tu demande

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par mouradj2006 Voir le message
    bjr;
    tu peux sauvegarder les indices initiales dans votre tableau ; a chaque permutation que tu fait dans le tableau A tu fait une permutation dans le tableau des indices .
    j’espère que je bien compris ce que tu demande

    c'est bien ce que j'ai fait à chaque permutation dans A une permutation dans le tableau d'indices mais ca marche pas

  4. #4
    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

    c'est un trie à bulle que tu utilise ?

    voila ce que tu aurais due faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      n := taille(A);
      for i=n:1
        for j=1:i-1
          if(A(j) > A(j+1) ) 
              aux= A(i);
              A(i)=A(j+1);
              A(j+1)=aux;
              auxun=posenA(1,i);
              posenA(1,i)=posenA(1,j+1);
              posenA(j+1)=auxun;
          end
        end
       end
    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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut

    c'est un trie à bulle que tu utilise ?

    voila ce que tu aurais due faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      n := taille(A);
      for i=n:1
        for j=1:i-1
          if(A(j) > A(j+1) ) 
              aux= A(i);
              A(i)=A(j+1);
              A(j+1)=aux;
              auxun=posenA(1,i);
              posenA(1,i)=posenA(1,j+1);
              posenA(j+1)=auxun;
          end
        end
       end

    Salut anapurna,
    je suis désolé mais ta proposition ne marche pas meme le tri est faux!

  6. #6
    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

    bizarre
    je connais pas le langage dans lequel tu travail
    j'ai refait l'algo sous delphi mon langage de prédilection et cela marche correctement
    voici le résultat que j’obtiens
    5 = > 1
    6 = > 2
    6 = > 3
    6 = > 4
    6 = > 5
    6 = > 6
    6 = > 7
    7 = > 8
    7 = > 9
    7 = > 10
    8 = > 11
    8 = > 13
    8 = > 15
    9 = > 12
    9 = > 14
    10 = > 17
    10 = > 19
    10 = > 21
    11 = > 16
    12 = > 18
    12 = > 20
    13 = > 22
    13 = > 23
    la source est la suivante

    Code delphi : 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
    tab = array of integer;
     
    PROCEDURE  permuter(var t : tab ;indice1 :integer ;indice2 :integer);
      Var
        aux :integer ;
      Begin
      	Aux := t[indice1] ;
      	t[indice1] :=t[indice2] ;
      	t[indice2] :=aux ;
      end ;
    ....
     
     Memo1.Lines.clear;
      setlength(Indice,length(a));
      for ii:=low(A)to high(A) do
        Indice[ii]:=ii+1;
     
      n := length(A);
      for i:= n downto 1 do
        for j:= 1 to i-1 do
          if(A[j] > A[j+1] ) then
          begin
            permuter(A,j,j+1);
            permuter(Indice,j,j+1);
          end;
     
      //////////////////////////////////////////////////////////
      for i:=low(A) to  high(A) do
        Memo1.Lines.Add(Format('%d = > %d',[A[i],Indice[i]]));

    cela te donne quoi comme résultat ?
    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

  7. #7
    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

    j'ai compris dans ma transcription je me suis planté dans les indices

    ceci est faux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    aux= A(i);
              A(i)=A(j+1);
              A(j+1)=aux;
              auxun=posenA(1,i);
              posenA(1,i)=posenA(1,j+1);
              posenA(j+1)=auxun;
    a remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    aux= A(j);
              A(j)=A(j+1);
              A(j+1)=aux;
              auxun=posenA(1,j);
              posenA(1,j)=posenA(1,j+1);
              posenA(j+1)=auxun;
    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

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut

    bizarre
    je connais pas le langage dans lequel tu travail
    j'ai refait l'algo sous delphi mon langage de predilection et cela marche corectement
    voici le resultat que j'obtient


    le source est le suivant

    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
    tab = array of integer;
     
    PROCEDURE  permuter(var t : tab ;indice1 :integer ;indice2 :integer);
      Var
        aux :integer ;
      Begin
      	Aux := t[indice1] ;
      	t[indice1] :=t[indice2] ;
      	t[indice2] :=aux ;
      end ;
    ....
     
     Memo1.Lines.clear;
      setlength(Indice,length(a));
      for ii:=low(A)to high(A) do
        Indice[ii]:=ii+1;
     
      n := length(A);
      for i:= n downto 1 do
        for j:= 1 to i-1 do
          if(A[j] > A[j+1] ) then
          begin
            permuter(A,j,j+1);
            permuter(Indice,j,j+1);
          end;
     
      //////////////////////////////////////////////////////////
      for i:=low(A) to  high(A) do
        Memo1.Lines.Add(Format('%d = > %d',[A[i],Indice[i]]));
    cela te donne quoi comme resultat ?



    Re anapurna,
    j'ai pu corriger ta version voici la version correcte, il y a des erreurs dans la partie IF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(AA(1,j) > AA(1,j+1) ) 
              aux= AA(1,j);
              AA(1,j)=AA(1,j+1);
              AA(1,j+1)=aux;
              auxun=posenA(1,j);
              posenA(1,j)=posenA(1,j+1);
              posenA(1,j+1)=auxun;
          end

    merci c grâce à toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2012, 09h38
  2. Récupérer les valeurs dans un tableau
    Par ssxjim dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 26/01/2011, 20h49
  3. [FirePHP] Récupérer les logs dans un tableau php
    Par Concombre Masqué dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 10/12/2010, 11h48
  4. Récupérer les informations dans un tableau
    Par schats dans le forum Langage
    Réponses: 12
    Dernier message: 21/11/2008, 19h19
  5. Réponses: 5
    Dernier message: 04/03/2008, 22h22

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