Algorithme par insertion recursif

Intelego Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
J'etudie algorithme par insertion recursif. Et un mystère demeure insoluble dans ce code :


// Recursive Java program for insertion sort 

import java.util.Arrays; 

public class GFG 
{ 
 // Recursive function to sort an array using 
 // insertion sort 
 static void insertionSortRecursive(int arr[], int n) 
 { 
  // Base case 
  if (n <= 1) 
   return; 
 
  // Sort first n-1 elements 
  insertionSortRecursive( arr, n-1 ); 
 
  // Insert last element at its correct position 
  // in sorted array. 
  int last = arr[n-1]; 
  int j = n-2; 
 
  /* Move elements of arr[0..i-1], that are 
  greater than key, to one position ahead 
  of their current position */
  while (j >= 0 && arr[j] > last) 
  { 
   arr[j+1] = arr[j]; 
   j--; 
  } 
  arr[j+1] = last; 
 } 
 
 // Driver Method 
 public static void main(String[] args) 
 { 
  int arr[] = {12, 11, 13, 5, 6}; 
 
  insertionSortRecursive(arr, arr.length); 
  
  System.out.println(Arrays.toString(arr)); 
 } 
} 



lorsque le code appelle cinq fois de la méthode " insertionSortRecursive( arr, n-1 ); " il semble faire que le tableau va être évalué de gauche à droite.

Alors que le code " int last = arr[n-1];" et " int j = n-2; " (linge 14) et même "j--" (ligne 23) semble faire que le tableau va être évalué (ou les tableaux devrais-je dire selon vous ?) dans le sens contraire, depuis la fin vers le début.

C'est cette contradiction des sens des itérateurs qui me donne l’impression que tout les indices sont en sens contraire.

Illusion d'esprit ? Ou tout le monde va dans e même sens ? Mais comment cela s'explique ?

Merci,

Intelego.
A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Tu peux rajouter quelques lignes d'affichage :

Au début de la méthode :
System.out.println("Begin n=" + n + " arr=" + Arrays.toString(arr));

À la fin :
System.out.println("Finish n=" + n + " arr=" + Arrays.toString(arr));


Ce qui donne :

Begin n=5 arr=[12, 11, 13, 5, 6]
Begin n=4 arr=[12, 11, 13, 5, 6]
Begin n=3 arr=[12, 11, 13, 5, 6]
Begin n=2 arr=[12, 11, 13, 5, 6]
Begin n=1 arr=[12, 11, 13, 5, 6]
// Il n'y a pas de Finish n=1 à cause du return
Finish n=2 arr=[11, 12, 13, 5, 6]
Finish n=3 arr=[11, 12, 13, 5, 6]
Finish n=4 arr=[5, 11, 12, 13, 6]
Finish n=5 arr=[5, 6, 11, 12, 13]

Les valeurs de n sont en ordre décroissant pour la partie de code qui est avant l'appel récursif, mais elles sont en ordre croissant pour la partie de code qui est après.
0