tri.java

 
 1 package tableaux;
 2 class tri {    
 3     // méthode utilisée pour les tris
 4     public static void echange(int[]t,int i,int j){
 5         int tmp=t[i];
 6         t[i]=t[j];
 7         t[j]=tmp;
 8     }
 9     public static void triselection(int[] t){
10         triselection(t,0,t.length-1);
11     }
12     public static void triinsertion(int[] t){
13         triinsertion(t,0,t.length-1);
14     }
15     public static void triinsertionbis(int[] t){
16         triinsertionbis(t,0,t.length-1);
17     }
18     public static void tribulle(int[]t){
19         tribulle(t,0,t.length-1);
20     }
21     // tri par sélection
22     // invariant de la boucle
23     // t est trié sur [l,i[
24     // pour tout j de [i,r] et tout k de [l,r[ t[j]>=t[k]
25     public static void triselection(int[] t, int l,int r){
26         for(int i=l;i<=r;i++){
27             int min=i;
28             for(int j=i+1;j<=r;j++)
29                 if(t[j]<t[min])min=j;
30             echange(t,i,min);
31         }
32     }
33     // tri par insertion
34     // invariant de la boucle
35     // t est trié sur [l,i[
36     // l'élement t[i] est inséré à sa bonne position dans le t[l,i[
37     public static void triinsertion(int t[],int l,int r){
38         int i;
39         for(i=l;i<=r;i++)
40             for(int j=i;j>l;j--)
41                 if(t[j]<t[j-1])echange(t,j-1,j);
42     }
43     // version améliorée: une sentinelle évite le test de débordement
44     // les échanges s'arrêtent dès que l'élément à insérer est à sa place
45     // simplification des échanges
46     public static void triinsertionbis(int []t,int l, int r){
47         int i;
48         for(i=r;i>l;i--)if(t[i]<t[i-1])echange(t,i-1,i);
49         for(i=l+2;i <=r;i++){
50             int j=i; int tmp=t[i];
51             while(tmp<t[j-1]){
52                 t[j]=t[j-1];j--;
53             }
54             t[j]=tmp;
55         }
56     }
57     // tri-bulle
58     // invariant de la boucle (comme sélection)
59     // t est trié sur [l,i[
60     // pour tout j de [i,r] et tout k de [l,r[ t[j]>=t[k]
61     public static void tribulle(int[]t, int l,int r){
62         for(int i=l;i<=r;i++)
63             for(int j=r;j>i;j--)
64                 if(t[j]<t[j-1])echange(t,j-1,j);
65     }
66     
67 }