Je l'ai trouvé en temps O(n * log n) par la méthode suivante.
-
Fusionner le tableau de tri A et créer une copie (tableau B)
-
Prenez A[1] et trouvez sa position dans le tableau trié B par une recherche binaire. Le nombre d'inversions pour cet élément sera inférieur d'une unité au numéro d'index de sa position dans B puisque chaque nombre inférieur qui apparaît après le premier élément de A sera une inversion.
2a. accumuler le nombre d'inversions dans la variable de compteur num_inversions.
2b. supprimer A[1] du tableau A et également de sa position correspondante dans le tableau B
-
reprendre l'étape 2 jusqu'à ce qu'il n'y ait plus d'éléments dans A.
Voici un exemple d'exécution de cet algorithme. Tableau original A = (6, 9, 1, 14, 8, 12, 3, 2)
1 : Fusionner le tri et copier dans le tableau B
B = (1, 2, 3, 6, 8, 9, 12, 14)
2 : Prendre A[1] et faire une recherche binaire pour le trouver dans le tableau B
A[1] = 6
B = (1, 2, 3, 6 , 8, 9, 12, 14)
Le 6 est en 4ème position du tableau B, il y a donc 3 inversions. Nous le savons parce que 6 était en première position dans le tableau A, donc tout élément de valeur inférieure qui apparaîtrait ensuite dans le tableau A aurait un indice de j > i (puisque i dans ce cas est 1).
2.b : Retirer A[1] du tableau A et aussi de sa position correspondante dans le tableau B (les éléments en gras sont retirés).
A = ( 6, 9, 1, 14, 8, 12, 3, 2) = (9, 1, 14, 8, 12, 3, 2)
B = (1, 2, 3, 6, 8, 9, 12, 14) = (1, 2, 3, 8, 9, 12, 14)
3 : Ré-exécutez l'étape 2 sur les nouvelles matrices A et B.
A[1] = 9
B = (1, 2, 3, 8, 9, 12, 14)
Le 9 est maintenant en 5ème position du tableau B, il y a donc 4 inversions. Nous le savons parce que 9 était en première position dans le tableau A, donc tout élément de valeur inférieure qui apparaîtrait par la suite aurait un indice de j > i (puisque i dans ce cas est à nouveau 1). Retirez A[1] du tableau A et également de sa position correspondante dans le tableau B (les éléments en gras sont retirés).
A = ( 9 , 1, 14, 8, 12, 3, 2) = (1, 14, 8, 12, 3, 2)
B = (1, 2, 3, 8, 9 , 12, 14) = (1, 2, 3, 8, 12, 14)
En continuant dans cette voie, nous obtiendrons le nombre total d'inversions pour le tableau A une fois la boucle terminée.
L'étape 1 (tri par fusion) s'exécute en O(n * log n). L'étape 2 s'exécuterait n fois et, à chaque exécution, effectuerait une recherche binaire qui prendrait O(log n) pour s'exécuter, soit un total de O(n * log n). Le temps d'exécution total serait donc de O(n * log n) + O(n * log n) = O(n * log n).
Merci pour votre aide. Le fait d'écrire les tableaux d'échantillons sur une feuille de papier m'a vraiment aidé à visualiser le problème.