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

C Discussion :

Problème tri rapide.


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Par défaut Problème tri rapide.
    Bonjour,

    J'essaye de réaliser le tri rapide mais de temps en temps mon programme boucle infini. Je ne suis pas très à l'aise avec la récursion:

    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
     
    void            my_swap(int *s1, int *s2)
    {
      int s = *s1;
     
      *s1 = *s2;
      *s2 = s;
    }
     
    void            tri_rapide(int nb, int *tab)
    {
      if (nb < 2)
        return;
      int           pivot = rand()%nb;
      int           beg = 0;
      int           end = nb-1;
     
     
      pivot = tab[pivot];
      while (beg < end)
        {
          while (tab[beg] < pivot)
            beg++;
          while (tab[end] > pivot)
            end--;
          my_swap(tab + beg, tab + end);
        }
      tri_rapide(beg, tab);
      tri_rapide(nb-end, tab + end);
    }
    Merci pour votre aide.

    Edit:
    Je pense que cela arrive lorsque j'ai deux nombre egaux dans ma liste.
    Edit 2:
    J'ai ajouter cette ligne avant le swap et ça à l'air d'être stable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          if ((tab[end] == tab[beg]) && end != beg)
            beg++;
          else
            my_swap(tab + beg, tab + end);

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    C'est mega dangereux ton affaire !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (tab[beg] < pivot)
            beg++;
    Gros risque de lecture en memoire la ! Rajoute comme condition que beg doit aussi etre inferieur a la taille de ton tableau pour securiser ca.

    T'as marque que ca fonctionnait donc j'ai pas cherche plus loin.

Discussions similaires

  1. [liste] Problème de tri rapide
    Par sorry60 dans le forum C
    Réponses: 12
    Dernier message: 03/05/2006, 12h16
  2. Tri Rapide sur un CLIST
    Par ensisoft dans le forum MFC
    Réponses: 9
    Dernier message: 13/12/2005, 23h22
  3. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02
  4. Problême tri par ardre croissant
    Par vince86000 dans le forum ASP
    Réponses: 2
    Dernier message: 28/04/2005, 13h10
  5. Tri rapide
    Par DBBB dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 10/12/2004, 17h54

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