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 :

Réorganiser les éléments d'un vecteur (élem. négatifs,nuls,positif)


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1
    Par défaut
    ab

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    désolé on n'est pas sur www.onfaittesdevoirs.com

    Réfléchis, poste-nous ce que tu as fait, et là on t'aidera...

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 850
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 850
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par master_turc Voir le message
    Bonjour à tous, j'ai un petit problème concernant la réorganisation d'un vecteur, est ce que quelqu'un peut m'aider svp c'est assez urgent.

    Au fait nous avons un vecteur, exemple: 0 -3 7 3 1 -5 -3 2 -1 0 2 0 -6
    Le but est de non pas trier ce vecteur mais de rassembler les élements négatifs au début du vecteur suivis des élements nuls et pour finir tous les éléments positifs à la fin du vecteur.
    exemple: -3 -5 -3 -1 -6 0 0 0 7 3 1 2 2

    Pourriez vous m'aider en m'expliquant l'algorithme qui permet de faire ça mais il y a des contraintes: - Ne pas utiliser un tableau intermédiaire
    - L'algorithme ne doit parcourir le vecteur V qu'une
    seule fois (donc un tour de boucle!)
    remarque: Les élements négatifs,nuls ou positifs ne doivent pas forcément être trié, le but est uniquement de séparer ces 3 sous-groupe.Merci de votre aide
    En un seul tour de boucle je ne vois pas. On peut s'en sortir en implémentant un tri à bulle (en considérant qu'un élément négatif est plus petit qu'un élément nul qui lui-même est plus petit qu'un élément positif) mais ça implique quand-même plusieurs tours de boucles.
    Ou alors on commence par déterminer la taille de chaque sous-groupe puis on place un pointeur au début de chaque sous-groupe et tout élément du pointeur qui n'est pas à sa bonne place est échangé avec un autre mais ça implique quand-même 2 tours de boucles (un pour compter et un pour permuter)

    De toute façon ce n'est pas un pb de C mais un pb d'algo...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Jiu,

    Tiens, l'énoncé a changé.

    Dans le temps, c'était un tableau de boules de 3 couleurs, il fallait mettre les rouges au début du tableau, puis les blanches, puis les bleues.

    C'est possible en un seul tour, il suffit de réfléchir un peu, et peut-être d'écrire sur un papier comment on peut faire ça à la main, en s'imposant de ne jamais revenir en arrière dans le tableau.

  5. #5
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par master_turc Voir le message
    voila ce que j'ai essayé de faire mais ca ne marche pas a tout les coups car jutilise le remplissement aléatoire.si vous pouvez optimiser ce code ce serait sympa de votre part.merci
    tu as la réponse ici :

    Citation Envoyé par droggo Voir le message
    C'est possible en un seul tour, il suffit de réfléchir un peu, et peut-être d'écrire sur un papier comment on peut faire ça à la main, en s'imposant de ne jamais revenir en arrière dans le tableau.



    Note : une petite aide : il te faudra 2 variables dernier_zero et dernier-negatif...

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Gio,
    Citation Envoyé par master_turc Voir le message
    voila ce que j'ai essayé de faire mais ca ne marche pas a tout les coups car jutilise le remplissement aléatoire.si vous pouvez optimiser ce code ce serait sympa de votre part.merci
    Tu veux dire "si vous pouvez corriger ce code ce serait sympa de votre part."

    On ne cherche pas à optimiser un code qui ne fonctionne pas.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La question n'est pas si facile à traiter aussi voici une manière d'aborder le problème:

    On note la position des éléments du tableau par
    - Deb pour le premier élément du tableau
    - PNPos pour le premier élément non positif du tableau
    - PNeg pour le premier élément négatif du tableau
    - Cur pour l'élément en cours d'analyse du tableau
    - Fin pour le dernier élément du tableau

    - Tous les élements entre [Deb et PNPos[ sont positifs
    - Tous les éléments entre [PNPos et PNeg[ sont nuls
    - Tous les éléments entre [PNeg et Cur[ sont négatifs
    - Les éléments entre [Cur et Fin] n'ont pas été analysés

    Schématiquement, on a les deux possibilités suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      deb      +      |         deb   +
               +      |               +
      PNPos    0      |  PNPos,PNeg   -
               0      |               -
      PNeg     -      |               -
               -      |               -
      Cur      ?      |        Cur    ?
               ?      |               ?
      Fin      ?      |        Fin    ?
    - Si l'élément courant est négatif, il est correctement positionné dans la zone des négatifs entre [PNeg et Fin]

    - Si il est null, on doit le positionner à la suite de PNeg en fin du bloc de zéro [PNPos et PNeg[. L'élément qui se trouvait en PNeg est négatif et remplacera le zéro dans la zone des négatifs. PNeg doit être mis à jour.
    Voici les deux possiblités avec la configuration avant et après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      deb      +       +            |        deb     +       +
               +       +            |                +       +
      PNPos    0       0    PNPos   | PNPos,PNeg     -x      0   PNPos
               0       0            |                -       -   PNeg
      PNeg     -x      0            |                -       -
               -       -    PNeg    |                -       -
      Cur      0       -x           |        Cur     0       -x
               ?       ?            |                ?       ?
      Fin      ?       ?            |        Fin     ?       ?
    - si il est positif, il faut le mettre en fin de zone des positifs [Deb et PNPos[ à la place de l'élément en pNPos. L'élément en PNPos était null ou négatif, on le placera en PNeg, fin de zone des nulls qui est également le début des négatifs. L'élément, négatif, qui était en PNeg va remplacer l'élément courant. PNPos et PNeg sont mis à jour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      deb      +       +            |        deb    +        +
               +       +            |               +        +
      PNPos    0       +x           | PNPos,PNeg    -y       +x
               0       0    PNPos   |               -        -    PNPos,PNeg
      PNeg     -y      0            |               -        -
               -       -    PNeg    |               -        -
      Cur      +x      -y           |       Cur     +x       -y
               ?       ?            |               ?        ?
      Fin      ?       ?            |       Fin     ?        ?
    Il reste à formaliser cette idée sous la forme d'un algorithme. L'algorithme obtenu est très court !

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 850
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 850
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par master_turc Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		if(vec[i]==0)
    		{
    			nul++;
    			temp=vec[nul];
    			vec[nul]=vec[i];
    			vec[nul]=temp;
    		}
    Il y a un problème sur la partie en rouge de ton code
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Dans le temps, c'était un tableau de boules de 3 couleurs, il fallait mettre les rouges au début du tableau, puis les blanches, puis les bleues.
    C'est le problème du drapeau hollandais de Dijkstra, et il s'applique parfaitement ici.

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 969
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 969
    Par défaut
    Kio,
    Citation Envoyé par PRomu@ld Voir le message
    C'est le problème du drapeau hollandais de Dijkstra, et il s'applique parfaitement ici.
    Je n'ai pas dit le contraire, sinon pourquoi aurais-je rappelé ça ?

    D'ailleurs, le problème est plus connu sous le nom de "problème du drapeau tricolore", sans précision de la nationalité du drapeau.
    Ce qui ne signifie pas que ta dénomination est fausse, seulement moins courante (ça se trouve, c'est la bonne d'origine, j'ai la flemme de chercher ).

Discussions similaires

  1. Recopier les éléments d'un vecteur sur une feuille excel
    Par bsangoku dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/05/2013, 16h32
  2. labelliser les éléments d'un vecteur
    Par nanopriso dans le forum R
    Réponses: 2
    Dernier message: 18/11/2012, 20h57
  3. Gui - Java App - ajouter, supprimer, réorganiser les éléments
    Par alibm dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 06/03/2011, 02h30
  4. réorganiser les éléments d'un tableau
    Par xtimas dans le forum C
    Réponses: 4
    Dernier message: 23/06/2010, 11h45
  5. Soustraction d'une constante à tous les éléments d'un vecteur?
    Par amery dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 27/06/2007, 15h51

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