précédent | suivant | table des matières | s'évaluer |
|
Cette classe contient des méthodes statiques permettant de manipuler de tableaux :
La méthode static String toString(X[] a) retourne une chaîne de caractères contenant les éléments du tableau (convertis en chaîne de caractères), séparés par des virgules, et entre crochets.
La méthode static boolean equals(X[] a, X[] a2) où X peut être un type primitif ou un Object retourne true si les deux tableaux sont égaux et false sinon. Deux tableaux sont égaux s’ils contiennent le même nombre d’éléments, et si les éléments de même rang sont égaux. Si des éléments du tableau peuvent être des tableaux, il faut utiliser la méthode deepEquals(X[] a, X[] a2).
La méthode static void fill(X[] a, X val) affecte la valeur val à tous les éléments du tableau a.
La méthode static int binarySearch(X[] a, X cle) effectue une recherche de cle dans le tableau trié a. La méthode retourne l’indice de l’élément s’il existe, et – pointDInsertion-1 si cle ne se trouve pas dans le tableau. La valeur pointDInsertion est le rang où la clé serait ajoutée, si on l’ajoutait au tableau. C'est le rang du premier élément plus grand que l'élément cherché, ou la taille du tableau.
public static int binarySearch(int[] a, int cle) { int debut = 0; int fin = a.length-1; while (debut <= fin) { int milieu =( debut + fin)/2; if (a[milieu]< cle) debut = milieu + 1; else if (a[milieu]> cle) fin = milieu - 1; else return milieu; // trouvé } return -(debut + 1); // pas trouvé. }
La méthode static void sort(Object[] a) est programmée en utilisant :
1 Tri rapide
public static void sort(int[] a) { sort(a, 0, a.length); } private static void sort(int [] x, int off, int len) { // Tri par insertion si len <7 if (len < 7) { for (int i=off; i<len+off; i++) for (int j=i; j>off && x[j-1]>x[j]; j--) echanger(x, j, j-1); return; } // Choix du pivot int m = off + len/2; // pour les petits tableaux, // c’est l’élément du milieu if (len > 7) { int l = off; int n = off + len - 1; if (len > 40) { // Pour les grands tableaux le médian de 9 int s = len/8; l = med3(x, l, l+s, l+2*s); m = med3(x, m-s, m, m+s); n = med3(x, n-2*s, n-s, n); } m = med3(x, l, m, n); // tableaux moyen médian de 3 } int pivot = x[m]; // établir l’invariant: v* (<v)* (>v)* v* int a = off, b = a, c = off + len - 1, d = c; while(true) { while (b <= c && x[b] <= pivot) { if (x[b] == pivot) echanger(x, a++, b); b++; } while (c >= b && x[c] >= pivot) { if (x[c] == pivot) echanger(x, c, d--); c--; } if (b > c) break; echanger(x, b++, c--); } // mettre les valeurs égales au pivot au milieu int s, n = off + len; s = Math.min(a-off, b-a ); echanger(x, off, b-s, s); s = Math.min(d-c, n-d-1); echanger(x, b, n-s, s); // Appels récursifs sur les éléments non pivot. if ((s = b-a) > 1) sort(x, off, s); if ((s = d-c) > 1) sort(x, n-s, s); }
private static void echanger(int [] x, int a, int b) { int t = x[a]; x[a] = x[b]; x[b] = t; } private static void echanger(int x[], int a, int b, int n) { for (int i=0; i<n; i++, a++, b++) echanger(x, a, b); } private static int med3(int x[], int a, int b, int c) { return (x[a] < x[b] ? (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : (x[b] > x[c] ? b : x[a] > x[c] ? c : a)); }
2 Tri par fusion
public static void sort(Object[] a) { Object [] aux =(Object[])a.clone(); mergeSort(aux, a, 0, a.length); } private static void mergeSort(Object src[], Object dest[], int deb, int fin) {< int longueur = fin - deb; // tri par insertion pour les petits tableaux if (longueur < 7) { for (int i=deb; i<fin; i++) for (int j=i; j>deb && ((Comparable)dest[j-1]).compareTo ((Comparable)dest[j]) >0; j--) swap(dest, j, j-1); return; } // trier les 2 moitiés de dest vers src int milieu = (deb + fin)/2; mergeSort(dest, src, deb, milieu); mergeSort(dest, src, milieu, fin); // Si src est ordonné, copier src dans dest if (((Comparable)src[milieu-1]).compareTo((Comparable) src[milieu]) <= 0) { System.arraycopy(src, deb, dest, fin, longueur); return; } /// fusionner les 2 moitiés de src vers dest for(int i = deb, p = deb, q = milieu; i < fin; i++) { if (q>=fin || p<milieu && ((Comparable)src[p]).compareTo(src[q])<=0) dest[i] = src[p++]; else est[i] = src[q++]; } }