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

Résolu
F_Pignon Messages postés 23 Date d'inscription   Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    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
  2. F_Pignon Messages postés 23 Date d'inscription   Statut Membre 1
     
    Bonjour mamiemando et dubcek

    Merci a tous les deux, je vais regarder ce que je peux trouver
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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