IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Algorithmes > Tris
        Tri à bulles
        Tri par insertion
        Tri rapide
        Tri par selection
        Tri de Shell
        Tri par paniers

rechercher
precedent    sommaire    suivant    telechargermiroir


Auteur : Davidbrcz
Version : 13/08/2008
Tri à bulles
Voici un tri à bulles sous sa version template. Il accepte n'importe quel conteneur supportant l'accès aléatoire et disposant de size().

Version iterative

template <class T> void triBulleIter(T& v)
{
    const int N=v.size();

    for(int i=0;i<N;++i)
    {
      for(int j=1;j<N-i;++j)
      {
          if(v[j]<v[j-1])
            std::swap(v[j],v[j-1]);
      }
    }
}
version récursive:

template <class T>
void triBulleRecur(T& v)
{
    static int n=0;

    const int N=v.size();
    const int N2=N-1-n;

    for(int i=0;i<N2;++i)
    {
      if(v[i]>v[i+1])
                std::swap(v[i],v[i+1]);
    }

    n++;

    if(N-n>1)
      triBulleRecur(v);
    else
      n=0;
}

Auteur : Davidbrcz
Version : 13/08/2008
Tri par insertion
Voici un tri par insertion sous sa version template. Comme le précédent, il accepte n'importe quel conteneur disposant de operator[] et de size()

template <class T> void triInsertion(T& v) 
{
    int p=0;
    typename T::value_type x;

    const int N=v.size();

    for (int i = 1; i < N; ++i) 
    {
        x = v[i]; 
        for(p = 0; v[p] < x; ++p);
 
        for (int j = i-1; j >= p; j--) {
            v[j+1] = v[j]; 
        }   
 
        v[p] = x; 
    }
}

Auteur : Davidbrcz
Version : 13/08/2008
Tri rapide
Voici une version template du tri rapide. Il dispose des mêmes pré-conditions que les tris précédent.

template <class T> void triRapide(T& v, int p, int r)
{
        if(p<r)
        {
          int q = partitionner(v, p, r);
          triRapide(v, p, q);
          triRapide(v, q+1, r);
        }
}
 
template <class T> int partitionner(T& v, int p, int r) 
{
    typename T::value_type pivot = v[p], i = p-1, j = r+1;

        while(1) 
      {
          do
          {
            j--;
          } while(v[j] > pivot);

          do
          {
                        i++;
          } while(v[i] < pivot);

                if(i<j) 
            {
                std::swap(v[i],v[j]);
                }
                else
                break;
        }
        return j;
}

Auteur : Davidbrcz
Version : 13/08/2008
Tri par selection
Version template du tri par sélection. Toujours les même pré-conditions.

template <class T>void triSelection(T& v)
{
    int min=0;
    const int N=v.size();
    for (int i = 0; i < N-1; ++i)
    {
        min=i;
        for (int j=i+1; j<N; ++j)
        {
            if(v[j]<v[min])
                min=j;
        }

        if(min!=i)
            std::swap(v[i],v[min]);
    }
}

Auteur : Davidbrcz
Version : 13/08/2008
Tri de Shell
Voic une implémentation du tri de Shell laxiste sur le conteneur. Comme les autres tris, seul size() et operator[] doivent être forcément présent.

template <class T> void triShellPhase(T& v, int gap) 
{
    typename T::value_type value;
    int j=0;

    const int N=v.size();

    for (int i = gap; i < N; ++i) 
    {
        value = v[i];
        for (j = i - gap; j >= 0 && v[j] > value; j -= gap) {
            v[j + gap] = v[j];
        }
        v[j + gap] = value;
    }
}
 
template <class T>void triShell(T& v) 
{
    const int gaps[]={1, 4, 10, 23, 57, 132, 301, 701};
    const int N=sizeof(gaps)/sizeof(gaps[0])-1;
 
    for (int sizeIndex = N;sizeIndex >= 0;--sizeIndex)
        triShellPhase(v, gaps[sizeIndex]);
}

Auteur : Davidbrcz
Version : 13/08/2008
Tri par paniers
Voici une version template su seul tri non en place de la liste: le tri à panier

template <class T>
void triPanier(T& v)
{   
    typedef typename T::value_type value_type;
    typedef typename std::map<value_type,int>::iterator map_it;

    const int N=v.size();
    std::map<value_type,int> tmp;

    for(int i=0;i<N;++i)
      tmp[v[i]]++;

    int index=0;
    map_it ite=tmp.end();
    for(map_it it=tmp.begin();it!=ite;++it)
    {
      for(int j=0;j<(*it).second;++j)
          v[index++]=(*it).first;
    }

}

rechercher
precedent    sommaire    suivant    telechargermiroir

Consultez les autres pages sources


Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.