Pour deux fonctions réelles positives f et g, on écrit
Donnée : N nombres entiers
Résultat : Réarrangement croissant
des nombres a[i].
Autre formulation : Recherche de la permutation
de
telle que
Exemple:
Principe: A la i-ème étape, insérer a[i]parmi
.
static void triInsertion() {
int i,j,v;
for (i=1; i< N; ++i) {
v = a[i]; j = i;
while (j>0 && a[j-1] > v) {
a[j] = a[j-1];
--j;
}
a[j] = v;
}
}
Temps de calcul:
au pire des cas
et en moyenne.
class TriInsertion {
final static int N = 10;
static int[] a = new int[N];
static void initialisation() {
for (int i= 0; i< N; i++)
a[i] = (int) (Math.random() * 128);
}
static void impression() {
for (int i= 0; i< N; i++)
System.out.print(a[i]+ " ");
System.out.println();
}
static void triInsertion() {...}
public static void main(String[] args) {
initialisation();
impression();
triInsertion();
impression();
}
}
static void triBulle() {
int i, j, t;
for (i= 0; i< N; ++i)
for (j= N-1; j> i; --j)
if (a[j-1] > a[j]) {
t= a[j-1]; a[j-1]= a[j]; a[j]= t;
}
}
Complexité:
On raisonne sur la permutation
donnant la place du i-ème
élément.
Une inversion de
est une paire (i,j) d'indices telle
que i<j et
.
Chaque échange de deux éléments de a par l'algorithme supprime
exactement une inversion de
.
Le nombre d'échanges est donc égal au nombre d'inversions de
.
Or le nombre moyen d'inversions d'une permutation1 est
Recherche d'un entier v dans la table
static int Recherche(int v) {
for (int i=0; i < N; i++)
if (v == a[i]) return i;
return -1;
}
Complexité:
(avec N/2opérations en moyenne).
En pratique: environ 1mn pour 1 Giga éléments (si on fait 107 comparaisons/s).
Hypothèse: La table est ordonnée:
static int Dicho (int v) {
int i, g, d;
g= 0; d= N-1;
while (g <= d) {
i=(g+d)/2;
if (v == a[i]) return i;
if (v < a[i]) d= i-1;
else g= i+1;
}
return -1;
}
Complexité:
. Pour N=104,
on a 14 comparaisons environ au lieu de 5000 pour la recherche
séquentielle.
Principe: on utilise une fonction
Problèmes:
Principe: On utilise une suite de fonctions
de hachage
pour ranger x.
Par exemple:
On choisit h' de façon que N et h'(k) soient toujours premiers entre eux (par exemple N est une puissance de 2 et h'(k) est impair).
Programmes pour la recherche et l'insertion avec un hachage linéaire :
Recherche d'un élément :
static int Recherche (int x) {
int i;
i= h(x);
while (a[i] != VIDE) {
if (a[i] == x) return i;
i= (i+1) % N;
}
return -1;
}
Insertion d'un élément :
static int Inserer(int x) {
int i;
i= h(x);
while (a[i] != VIDE && x != a[i])
i= (i+1) % N;
a[i] = x;
return i;
}
Hypothèse: Le rehachage est uniforme: Les
valeurs
sont successivement indépendantes
et ont chacune une distribution uniforme.
Taux de remplissage:
.
Nombre moyen
d'essais pour insérer un élément: