| |
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;
}
|
|
| |
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;
}
}
|
|
| |
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;
}
|
|
| |
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]);
}
}
|
|
| |
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]);
}
|
|
| |
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;
}
}
|
|
Consultez les autres pages sources


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.