A chaque niveau, on effectue des tris de taille M sur un certain nombre de tranches/blocs Role de chaque fonction ipow(a, b) : calcule a^b par multiplications successives. cmp_int(a, b) : comparateur d'entiers pour qsort (retourne l'ordre). reorder_blocks(base, block_sz, M, idx) : reordonne, dans un groupe de M blocs contigus de taille block_sz, l'ordre des blocs selon le tableau d'indices idx (via un tampon temporaire). sort_ND(a, N, M) : - trie chaque sous-tableau 1D de longueur M (dimension la plus basse) pour chaque niveau 2...N, calcule la somme de chaque bloc de la dimension inferieure, trie les blocs selon ces sommes, puis rerdonne physiquement les blocs. Complexite de l'algorithme principal (sort_ND) : O(M^N * log (M))