Algorithme par insertion recursif

Fermé
Intelego Messages postés 1 Date d'inscription dimanche 9 décembre 2018 Statut Membre Dernière intervention 9 décembre 2018 - Modifié le 10 déc. 2018 à 00:08
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 10 déc. 2018 à 07:54
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
10 déc. 2018 à 07:54
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