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

Résolu
F_Pignon Messages postés 23 Date d'inscription   Statut Membre Dernière intervention   -  
lami20j Messages postés 21331 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
A voir également:

5 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
0
F_Pignon Messages postés 23 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour mamiemando et dubcek

Merci a tous les deux, je vais regarder ce que je peux trouver
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

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