forked from menault/TD4_DEV51_Qualite_Algo
84 lines
2.7 KiB
Java
84 lines
2.7 KiB
Java
import java.lang.reflect.Array;
|
|
import java.util.Arrays;
|
|
import java.util.Comparator;
|
|
|
|
public class Tri {
|
|
|
|
public static void sort(Object array) {
|
|
if (array == null || !array.getClass().isArray()) {
|
|
throw new IllegalArgumentException("Un tableau est attendu.");
|
|
}
|
|
processArray(array);
|
|
}
|
|
|
|
// renvoie la somme (long) de tous les entiers contenus dans ce sous-arbre et effectue le tri en place
|
|
private static long processArray(Object arr) {
|
|
Class<?> cls = arr.getClass();
|
|
if (!cls.isArray()) throw new IllegalArgumentException("Array attendu");
|
|
|
|
Class<?> comp = cls.getComponentType();
|
|
|
|
// Feuille primitive int[]
|
|
if (comp.isPrimitive()) {
|
|
if (comp == int.class) {
|
|
int[] a = (int[]) arr;
|
|
Arrays.sort(a);
|
|
long s = 0;
|
|
for (int v : a) s += v;
|
|
return s;
|
|
} else {
|
|
throw new IllegalArgumentException("Type primitif non géré : " + comp);
|
|
}
|
|
}
|
|
|
|
// Feuille Integer[]
|
|
if (comp == Integer.class) {
|
|
Integer[] a = (Integer[]) arr;
|
|
Arrays.sort(a);
|
|
long s = 0;
|
|
for (Integer v : a) if (v != null) s += v;
|
|
return s;
|
|
}
|
|
|
|
// Sinon, éléments sont des sous-tableaux (ou éventuellement Number)
|
|
int n = Array.getLength(arr);
|
|
long[] sums = new long[n];
|
|
for (int i = 0; i < n; i++) {
|
|
Object child = Array.get(arr, i);
|
|
if (child == null) {
|
|
sums[i] = 0;
|
|
} else if (child.getClass().isArray()) {
|
|
sums[i] = processArray(child);
|
|
} else if (child instanceof Number) {
|
|
sums[i] = ((Number) child).longValue();
|
|
} else {
|
|
throw new IllegalArgumentException("Élément non géré : " + child.getClass());
|
|
}
|
|
}
|
|
|
|
// tri stable des éléments du tableau courant selon sums
|
|
Integer[] idx = new Integer[n];
|
|
for (int i = 0; i < n; i++) idx[i] = i;
|
|
Arrays.sort(idx, Comparator.comparingLong(i -> sums[i]));
|
|
|
|
Object sorted = Array.newInstance(comp, n);
|
|
for (int k = 0; k < n; k++) {
|
|
Array.set(sorted, k, Array.get(arr, idx[k]));
|
|
}
|
|
// recopie dans arr
|
|
for (int i = 0; i < n; i++) {
|
|
Array.set(arr, i, Array.get(sorted, i));
|
|
}
|
|
|
|
long total = 0;
|
|
for (long v : sums) total += v;
|
|
return total;
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
int[][] a = { {0,3,2}, {9,4,5}, {4,1,3} };
|
|
sort(a);
|
|
System.out.println(Arrays.deepToString(a));
|
|
}
|
|
}
|