Tri d'une listbox [Résolu]

JacKrauser 31 Messages postés lundi 14 mai 2012Date d'inscription 21 août 2012 Dernière intervention - 14 mai 2012 à 15:13 - Dernière réponse : cs_walidlam 111 Messages postés lundi 30 mai 2011Date d'inscription 29 avril 2013 Dernière intervention
- 19 mai 2012 à 15:35
Salut à tous !
Voilà j'ai un problème concernant le tri d'une listbox sous Delphi 7.
Je n'arrive pas à la trier malgré une méthode assez simple.
Est ce que vous voyez quelque chose de faux dans mon algorithme ?

//tri
  nombre:=lbxListe.Items.Count-1;
  if nombre>1 then
  begin
    for j:=0 to nombre do
    pluspetit:=StrToFloat(lbxListe.Items.Strings[j]);
    begin
      for i:=j to nombre do
      begin
        if (StrToFloat(lbxListe.Items.Strings[i])j) then
        begin
        aide:=StrToFloat(lbxListe.Items.Strings[j]);
        lbxListe.Items.Strings[j]:=lbxListe.Items.Strings[positionechange];
        lbxListe.Items.Strings[positionechange]:=FloatToStr(aide);
        end;
    end;
  end;


Merci d'avance !
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 14 mai 2012 à 20:29
3
Merci
Salut,

ton problème est très simple:
un "begin" mal placé ou manquant et un oubli "Positionechange := J;".

Je te donne ton code modifié pour comprendre ce qui clochait et une version plus simple et efficace de ton code.
[hr] procedure  TfrmSort.btnSortClick(Sender: TObject);

[b]var
  /bNombre, I, J, Positionechange: Integer;
  PlusPetit, Aide: Extended;
[b]begin
  /b //tri
  nombre : = lbxListe.Items.Count - 1;
  if nombre > 1 [b]then
    for /bj :=  0  to  nombre [b]do
    begin
      /bpluspetit : = StrToFloat(lbxListe.Items.Strings[j]);
      Positionechange :=  J;  // indispenssable sous peine d'erreur
      [b]begin
        for /bi : = j  to  nombre [b]do
        begin
          if /b(StrToFloat(lbxListe.Items.Strings[i]) < pluspetit) [b]then
          begin
            /bpluspetit : = StrToFloat(lbxListe.Items.Strings[i]);
            positionechange :=  i;
           end ;
        end;
        if (positionechange <> j) [b]then
        begin
          /baide : = StrToFloat(lbxListe.Items.Strings[j]);
          lbxListe.Items.Strings[j] :=  lbxListe.Items.Strings[positionechange];
          lbxListe.Items.Strings[positionechange] := FloatToStr(aide);
         end ;
      end;
    end;
end;
[hr]et le code simplifié:[hr]procedure TfrmSort.btnSort2Click(Sender: TObject);
[b]var
  /bNombre, I, J, Positionechange: Integer;
  PlusPetit: Extended;
[b]begin
  /bNombre : = lbxListe.Items.Count - 1;
  if Nombre > 1 [b]then
    for /bj :=  0  to  nombre [b]do
    begin
      /bPlusPetit : = StrToFloat(lbxListe.Items.Strings[J]);
      Positionechange :=  J;
       for  I : = J to Nombre [b]do
      begin
        if /b(StrToFloat(lbxListe.Items.Strings[I]) < PlusPetit) [b]then
        begin
          /bPlusPetit := StrToFloat(lbxListe.Items.Strings[I]);
          Positionechange := I;
        end;
      end;
      if (Positionechange <> J) [b]then
        /blbxListe.Items.Exchange(Positionechange, J);
    end;
end;
[hr]
ce petit code peut suffire pour trier une petite liste mais pour une plus grande je pense qu'il faudrait utiliser une autre méthode comme "Quick Sort" par ex.


[hr]@+Cirec
[hr]

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de Cirec
JacKrauser 31 Messages postés lundi 14 mai 2012Date d'inscription 21 août 2012 Dernière intervention - 14 mai 2012 à 21:06
0
Merci
Ca marche ;D
Merci pour le code simplifié, et un merci pour ta réponse.
Ca m'aide énormément !
Compris pour l'erreur, par contre y'a t'il de la documentation sur le "Quick Sort" sur le site ?
Commenter la réponse de JacKrauser
cs_walidlam 111 Messages postés lundi 30 mai 2011Date d'inscription 29 avril 2013 Dernière intervention - 16 mai 2012 à 18:27
0
Merci
bonsoir !!
voila uncode plus simple
procedure TfrmSort.btnSortClick(Sender: TObject);
VAR I,j:integer; k:STRING;
begin
for i:=0 to lbxListe.Items.Count - 1 do
for j:=i to lbxListe.Items.Count - 1  do
if (StrToFloat(lbxListe.Items.Strings[J]))< (StrToFloat(lbxListe.Items.Strings[I]))then
begin
k:=lbxListe.Items.Strings[I];
lbxListe.Items.Strings[I]:=lbxListe.Items.Strings[J];
lbxListe.Items.Strings[J]:=k;
end;

end;

merci @+
Commenter la réponse de cs_walidlam
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 17 mai 2012 à 13:18
0
Merci
@walidlam,

ton code est plus petit mais plus long en temps d'exécution
mais et surtout il donne un mauvais résultat !!!!

un code plus simple et/ou plus court est souvent bien plus lent que le même code en plusieurs lignes

regarde cette page et compares les deux réponses acceptées (en vert) il y a un code d'une ligne et un de onze lignes ... ils font tous deux la même chose mais celui de 11 lignes est aussi 11 fois plus rapide que le code en 1 ligne ... C.Q.F.D.


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
cs_walidlam 111 Messages postés lundi 30 mai 2011Date d'inscription 29 avril 2013 Dernière intervention - 17 mai 2012 à 13:26
0
Merci
salut CIREC
merci pour la remarque
comme t as dit ce code peut suffire pour trier une petite liste !!
tester le je pense qu'il va donner meme resultat
et merci @+
Commenter la réponse de cs_walidlam
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 19 mai 2012 à 12:48
0
Merci
re,

alors oui ton code donne un bon résultat

[quote=Cirec]ce code peut suffire pour trier une petite liste !!/quote

et oui j'ai dit ça
mais pas à n'importe quel prix !!!!

si on prend cette liste:
      25420,2325
      7854,1478
      125896,21
      9875,32
      5523,00
      22,17
      10,88
      5652,255
      5652,025
      1,0
      5,0
      4,0
      3,0
      2,0
      1,0
      0,1
      1,0


le code de "JacKrauser" (version simplifié ou non) à besoin de faire 13 échanges pour trier 17 valeurs ...
Alors que ta version à besoin de 118 échanges pour faire le même travail.

si on ajoute une valeur à cette liste:
      25420,2325
      7854,1478
      125896,21
      9875,32
      5523,00
      22,17
      10,88
      5652,255
      5652,025
      1,0
      5,0
      4,0
      3,0
      2,0
      1,0
      0,1
      1,0
      0,005
le code de "JacKrauser" à besoin de faire 16 échanges pour trier 18 valeurs ...
Alors que le tien à besoin de 133 échanges pour le même résultat.

tu vois bien que ... économiser quelques lignes de code peut couter très très chère en temps d'exécution et en cycles.
Devoir changer 133 fois les valeurs de place pour trier une liste de 18 entrées n'est pas acceptable d'autant plus ce que nombre augmente rapidement à chaque item supplémentaire dans la liste.


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
cs_walidlam 111 Messages postés lundi 30 mai 2011Date d'inscription 29 avril 2013 Dernière intervention - 19 mai 2012 à 15:35
0
Merci
salut Cirec
merci bien de cette lecon ca me fait un plaisir @+
Commenter la réponse de cs_walidlam

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.