[PERL] Trier éléments d'un tab SANS sort

Résolu
Bonjour a tous ,

Dans le cadre d'un exercice je dois trier les éléments (numériques) d'une liste, mais sans utiliser la fonction "sort".

Par exemple pour le tableau suivant :
@tablo=(9,3,7,14,8,7,25,12,1,6);

je faisais simplement :
@tablo2 = sort {$a <=> $b} @tablo;
print "Tableau trié :\n";
foreach $nb(@tablo2){
        print "$nb\n";
}

ce qui fonctionne très bien...

Pour faire la même chose sans la fonction sort.. (OK c'est tordu) je ne vois pas comment faire
peut être utiliser des combinaisons de conditions pour comparer les éléments (plus petits / plus grands) ?

Si quelqu'un pouvait m'aider

Merci d'avance

FPignon
Configuration: Linux
Konqueror 3.5

5 réponses

  1. Modérateur
    Je pense qu'il suffit que tu regardes les algos de tri classique (tri par insertion, tri à bulle, tri fusion etc) et que tu le réimplémentes en perl.

    Bonne chance
    0
    1. Bonjour mamiemando et dubcek

      Merci a tous les deux, je vais regarder ce que je peux trouver
      0
      1. Modérateur
        Salut,

        essaie ça
        #!/usr/bin/perl
        use strict;use warnings;
        
        my @tab = qw/9 3 7 14 8 7 25 12 1 6/;
        my ($n,$max,@tri);
        $max = $tab[0];
        
        print "@tab\n";
        while(@tab){
                $_ > $max and $max = $_ for @tab;
                for (@tab){ $n++;last if $max == $_}
                splice(@tab,$n-1,1);
                unshift @tri,$max;
                $n=0;
                $max = $tab[0];
        }
        print "@tri\n";
        __END__
        

        Le résultat
        root@debian:~# perl ccm.pl
        9 3 7 14 8 7 25 12 1 6
        1 3 6 7 7 8 9 12 14 25
        
        --
        0
        1. Modérateur
          Et voici un supplément
          root@debian:~# cat ccm.pl
          #!/usr/bin/perl
          use strict;use warnings;
          
          my @tab = qw/9 3 7 14 8 7 25 12 1 6/;
          my ($n,$max,@tri,@tri_desc);
          $max = $tab[0];
          
          print "@tab\n";
          while(@tab){
                  $_ > $max and $max = $_ for @tab;
                  for (@tab){ $n++;last if $max == $_}
                  unshift @tri,$max;
                  push @tri_desc,$max;
                  splice(@tab,$n-1,1);
                  $n=0;
                  $max = $tab[0];
          }
          print "ordre croissante:\t@tri\n";
          print "ordre decroissante:\t@tri_desc\n";
          __END__
          root@debian:~# perl ccm.pl
          9 3 7 14 8 7 25 12 1 6
          ordre croissante:       1 3 6 7 7 8 9 12 14 25
          ordre decroissante:     25 14 12 9 8 7 7 6 3 1
          
          L'algorithme
          TANT QUE le tableau contient des éléments
             trouve la valeur maximale
             cherche la position de l'élément trouvé
             ajouter l'élément au début du tableau trié, l'ordre croissante
             ajouter l'élément à la fin du tableau trié - l'ordre décroissante
             suppression d'élément trouvé avec splice
             réinitialiser la posion
             réinitialiser la valeur $max avec le 1er élément du tableau diminuer avec splice
          FIN TANT QUE
          
          --

          lami20j
          0